@vc-shell/framework 1.0.153 → 1.0.154
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/CHANGELOG.md +17 -0
- package/core/composables/useMenuService/index.ts +30 -24
- package/core/directives/loading/styles.css +1 -1
- package/core/types/index.ts +5 -1
- package/dist/core/composables/useMenuService/index.d.ts +2 -2
- package/dist/core/composables/useMenuService/index.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +5 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/framework.js +12655 -12557
- package/dist/index.css +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue.d.ts.map +1 -1
- package/dist/shared/components/popup-handler/types/index.d.ts +2 -2
- package/dist/shared/components/popup-handler/types/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/FIELD_MAP.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/SchemaRender.d.ts +42 -3
- package/dist/shared/modules/dynamic/components/SchemaRender.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/factories.d.ts +19 -17
- package/dist/shared/modules/dynamic/components/factories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/Button.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/Card.d.ts +14 -5
- package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +137 -0
- package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +14 -5
- package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +137 -0
- package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts +137 -0
- package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/Table.d.ts +137 -0
- package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/props.d.ts +15 -6
- package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/composables/index.d.ts +2 -0
- package/dist/shared/modules/dynamic/composables/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts +1 -0
- package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts +12 -0
- package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/{helpers/toolbarReducer.d.ts → composables/useToolbarReducer/index.d.ts} +6 -5
- package/dist/shared/modules/dynamic/composables/useToolbarReducer/index.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts +1 -1
- package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/factories/types/index.d.ts +2 -2
- package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/helpers/nodeBuilder.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/helpers/visibilityHandler.d.ts +4 -0
- package/dist/shared/modules/dynamic/helpers/visibilityHandler.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/index.d.ts +2 -1
- package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +15 -2
- package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +14 -1
- package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/types/index.d.ts +138 -36
- package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/types/models.d.ts +13 -21
- package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
- package/dist/shared/utilities/vueUtils.d.ts +1 -1
- package/dist/shared/utilities/vueUtils.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/index.d.ts +0 -1
- package/dist/ui/components/atoms/index.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-col/vc-col.vue.d.ts +4 -4
- package/dist/ui/components/atoms/vc-label/vc-label.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts +1 -1
- package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts +16 -2
- package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +4 -4
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-rating/index.d.ts +1 -119
- package/dist/ui/components/molecules/vc-rating/index.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +10 -3
- package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +6 -6
- package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
- package/package.json +6 -6
- package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +11 -11
- package/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue +4 -1
- package/shared/components/popup-handler/types/index.ts +2 -5
- package/shared/modules/dynamic/components/FIELD_MAP.ts +8 -0
- package/shared/modules/dynamic/components/SchemaRender.ts +15 -5
- package/shared/modules/dynamic/components/factories.ts +53 -35
- package/shared/modules/dynamic/components/fields/Button.ts +1 -2
- package/shared/modules/dynamic/components/fields/Card.ts +15 -6
- package/shared/modules/dynamic/components/fields/Checkbox.ts +15 -16
- package/shared/modules/dynamic/components/fields/ContentField.ts +2 -2
- package/shared/modules/dynamic/components/fields/CustomComponent.ts +19 -0
- package/shared/modules/dynamic/components/fields/DynamicProperty.ts +1 -2
- package/shared/modules/dynamic/components/fields/EditorField.ts +11 -14
- package/shared/modules/dynamic/components/fields/Fieldset.ts +62 -68
- package/shared/modules/dynamic/components/fields/GalleryField.ts +1 -2
- package/shared/modules/dynamic/components/fields/ImageField.ts +1 -2
- package/shared/modules/dynamic/components/fields/InputCurrency.ts +11 -14
- package/shared/modules/dynamic/components/fields/InputField.ts +11 -14
- package/shared/modules/dynamic/components/fields/MultivalueField.ts +11 -14
- package/shared/modules/dynamic/components/fields/RatingField.ts +21 -0
- package/shared/modules/dynamic/components/fields/SelectField.ts +11 -14
- package/shared/modules/dynamic/components/fields/StatusField.ts +1 -4
- package/shared/modules/dynamic/components/fields/SwitchField.ts +22 -0
- package/shared/modules/dynamic/components/fields/Table.ts +58 -0
- package/shared/modules/dynamic/components/fields/TextareaField.ts +11 -14
- package/shared/modules/dynamic/components/fields/VideoField.ts +1 -2
- package/shared/modules/dynamic/components/fields/props.ts +1 -5
- package/shared/modules/dynamic/composables/index.ts +2 -0
- package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +25 -26
- package/shared/modules/dynamic/composables/useTableTemplates/index.ts +63 -0
- package/shared/modules/dynamic/composables/useToolbarReducer/index.ts +71 -0
- package/shared/modules/dynamic/factories/base/useDetailsFactory.ts +2 -2
- package/shared/modules/dynamic/factories/types/index.ts +1 -1
- package/shared/modules/dynamic/helpers/nodeBuilder.ts +60 -39
- package/shared/modules/dynamic/helpers/visibilityHandler.ts +22 -0
- package/shared/modules/dynamic/index.ts +2 -1
- package/shared/modules/dynamic/pages/dynamic-blade-form.vue +47 -42
- package/shared/modules/dynamic/pages/dynamic-blade-list.vue +48 -88
- package/shared/modules/dynamic/types/index.ts +159 -34
- package/shared/modules/dynamic/types/models.ts +22 -21
- package/shared/utilities/vueUtils.ts +5 -1
- package/ui/components/atoms/index.ts +0 -1
- package/ui/components/atoms/vc-col/vc-col.vue +3 -3
- package/ui/components/atoms/vc-label/vc-label.vue +21 -7
- package/ui/components/molecules/vc-editor/vc-editor.vue +15 -7
- package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +22 -17
- package/ui/components/molecules/vc-field/vc-field.vue +48 -25
- package/ui/components/molecules/vc-input/vc-input.vue +7 -9
- package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +1 -1
- package/ui/components/molecules/vc-rating/index.ts +1 -10
- package/ui/components/molecules/vc-rating/vc-rating.stories.ts +1 -1
- package/ui/components/molecules/vc-rating/vc-rating.vue +10 -5
- package/ui/components/molecules/vc-select/vc-select.vue +4 -5
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +16 -24
- package/ui/components/organisms/vc-table/vc-table.vue +6 -5
- package/dist/shared/modules/dynamic/helpers/toolbarReducer.d.ts.map +0 -1
- package/dist/ui/components/atoms/vc-info-row/index.d.ts +0 -32
- package/dist/ui/components/atoms/vc-info-row/index.d.ts.map +0 -1
- package/dist/ui/components/atoms/vc-info-row/vc-info-row.stories.d.ts +0 -7
- package/dist/ui/components/atoms/vc-info-row/vc-info-row.stories.d.ts.map +0 -1
- package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts +0 -32
- package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts.map +0 -1
- package/shared/modules/dynamic/helpers/toolbarReducer.ts +0 -43
- package/ui/components/atoms/vc-info-row/index.ts +0 -3
- package/ui/components/atoms/vc-info-row/vc-info-row.stories.ts +0 -25
- package/ui/components/atoms/vc-info-row/vc-info-row.vue +0 -40
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import { unref, computed, toValue, h, UnwrapNestedRefs, MaybeRef, reactive, VNode } from "vue";
|
|
2
3
|
import FIELD_MAP from "../components/FIELD_MAP";
|
|
3
4
|
import { ControlSchema } from "../types";
|
|
4
|
-
import { IControlBaseProps
|
|
5
|
+
import { IControlBaseProps } from "../types/models";
|
|
5
6
|
import { getModel } from "./getters";
|
|
6
7
|
import { setModel } from "./setters";
|
|
7
8
|
import { unwrapInterpolation } from "./unwrapInterpolation";
|
|
8
9
|
import { DetailsBladeContext } from "../factories";
|
|
9
10
|
import { safeIn } from "./safeIn";
|
|
10
11
|
import { i18n } from "./../../../../core/plugins/i18n";
|
|
12
|
+
import { visibilityHandler } from "./visibilityHandler";
|
|
11
13
|
|
|
12
14
|
function disabledHandler(
|
|
13
15
|
disabled: { method?: string } | boolean,
|
|
@@ -50,9 +52,7 @@ function nodeBuilder<
|
|
|
50
52
|
const required = safeIn("rules", controlSchema) && controlSchema.rules?.required;
|
|
51
53
|
|
|
52
54
|
const contextProperty =
|
|
53
|
-
safeIn("property", controlSchema) &&
|
|
54
|
-
controlSchema.property &&
|
|
55
|
-
getModel(controlSchema.property, toValue(internalContext));
|
|
55
|
+
safeIn("property", controlSchema) && controlSchema.property && getModel(controlSchema.property, internalContext);
|
|
56
56
|
|
|
57
57
|
const scopedProperty =
|
|
58
58
|
safeIn("property", controlSchema) &&
|
|
@@ -77,7 +77,7 @@ function nodeBuilder<
|
|
|
77
77
|
disabledHandler(controlSchema.disabled, bladeContext));
|
|
78
78
|
|
|
79
79
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
-
const onUpdateModelValue = (e: any) => {
|
|
80
|
+
const onUpdateModelValue = async (e: any) => {
|
|
81
81
|
if (safeIn("property", controlSchema) && controlSchema.property) {
|
|
82
82
|
setModel({
|
|
83
83
|
property: controlSchema.property,
|
|
@@ -94,7 +94,7 @@ function nodeBuilder<
|
|
|
94
94
|
) {
|
|
95
95
|
const updateMethod = controlSchema.update.method;
|
|
96
96
|
if (safeIn(updateMethod, bladeContext.scope) && typeof bladeContext.scope[updateMethod] === "function") {
|
|
97
|
-
bladeContext.scope[updateMethod](e, controlSchema.property, toValue(internalContext));
|
|
97
|
+
await bladeContext.scope[updateMethod](e, controlSchema.property, toValue(internalContext));
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
}
|
|
@@ -102,24 +102,20 @@ function nodeBuilder<
|
|
|
102
102
|
|
|
103
103
|
const baseProps: IControlBaseProps = reactive({
|
|
104
104
|
key: `${parentId}`,
|
|
105
|
-
label:
|
|
105
|
+
label: computed(() => (label ? t(label) : undefined)),
|
|
106
106
|
disabled,
|
|
107
107
|
name,
|
|
108
108
|
rules,
|
|
109
|
-
placeholder:
|
|
109
|
+
placeholder: computed(() => (placeholder ? t(placeholder) : undefined)),
|
|
110
110
|
required,
|
|
111
111
|
modelValue,
|
|
112
112
|
"onUpdate:modelValue": onUpdateModelValue,
|
|
113
|
-
tooltip:
|
|
113
|
+
tooltip: computed(() => (tooltip ? t(tooltip) : undefined)),
|
|
114
114
|
multilanguage,
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
safeIn("visibility", controlSchema) && controlSchema.visibility?.method
|
|
120
|
-
? bladeContext.scope?.[controlSchema.visibility?.method]
|
|
121
|
-
: true,
|
|
122
|
-
),
|
|
115
|
+
class:
|
|
116
|
+
"horizontalSeparator" in controlSchema && controlSchema.horizontalSeparator
|
|
117
|
+
? "tw-border-b tw-border-solid tw-border-b-[#e5e5e5] tw-mb-[5px] tw-pb-[21px]"
|
|
118
|
+
: "",
|
|
123
119
|
});
|
|
124
120
|
|
|
125
121
|
const component = FIELD_MAP[controlSchema.component as keyof typeof FIELD_MAP];
|
|
@@ -127,45 +123,70 @@ function nodeBuilder<
|
|
|
127
123
|
const fieldsHandler = computed(() => {
|
|
128
124
|
if (!("fields" in controlSchema)) return null;
|
|
129
125
|
|
|
130
|
-
const
|
|
126
|
+
const contextFieldModel =
|
|
131
127
|
safeIn("property", controlSchema) &&
|
|
132
128
|
controlSchema.property &&
|
|
133
129
|
getModel(controlSchema.property, toValue(internalContext));
|
|
134
130
|
|
|
135
|
-
const
|
|
131
|
+
const scopedFieldModel =
|
|
132
|
+
safeIn("property", controlSchema) &&
|
|
133
|
+
controlSchema.property &&
|
|
134
|
+
getModel(controlSchema.property, toValue(bladeContext.scope ?? {}));
|
|
135
|
+
|
|
136
|
+
const model = toValue(scopedFieldModel) || toValue(contextFieldModel);
|
|
136
137
|
|
|
137
138
|
if (model && Array.isArray(model)) {
|
|
138
139
|
return model.map((modelItem: { [x: string]: unknown; id: string }) =>
|
|
139
|
-
controlSchema.fields.
|
|
140
|
+
controlSchema.fields.reduce((arr, fieldItem) => {
|
|
141
|
+
if (
|
|
142
|
+
safeIn("visibility", fieldItem) &&
|
|
143
|
+
fieldItem.visibility?.method &&
|
|
144
|
+
!visibilityHandler(bladeContext.scope?.[fieldItem.visibility?.method], toValue(modelItem), fieldItem)
|
|
145
|
+
) {
|
|
146
|
+
return arr;
|
|
147
|
+
}
|
|
148
|
+
return [
|
|
149
|
+
...arr,
|
|
150
|
+
nodeBuilder({
|
|
151
|
+
controlSchema: fieldItem,
|
|
152
|
+
parentId: `fieldset-${fieldItem.id}-${modelItem.id}`,
|
|
153
|
+
internalContext: modelItem,
|
|
154
|
+
bladeContext,
|
|
155
|
+
currentLocale,
|
|
156
|
+
formData,
|
|
157
|
+
}),
|
|
158
|
+
];
|
|
159
|
+
}, [] as VNode[]),
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return [
|
|
164
|
+
controlSchema.fields.reduce((arr, field) => {
|
|
165
|
+
if (
|
|
166
|
+
safeIn("visibility", field) &&
|
|
167
|
+
field.visibility?.method &&
|
|
168
|
+
!visibilityHandler(bladeContext.scope?.[field.visibility?.method], toValue(internalContext), field)
|
|
169
|
+
) {
|
|
170
|
+
return arr;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return [
|
|
174
|
+
...arr,
|
|
140
175
|
nodeBuilder({
|
|
141
|
-
controlSchema:
|
|
142
|
-
parentId: `fieldset-${
|
|
143
|
-
internalContext
|
|
176
|
+
controlSchema: field,
|
|
177
|
+
parentId: `fieldset-${parentId}-${field.id}`,
|
|
178
|
+
internalContext,
|
|
144
179
|
bladeContext,
|
|
145
180
|
currentLocale,
|
|
146
181
|
formData,
|
|
147
182
|
}),
|
|
148
|
-
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return [
|
|
153
|
-
controlSchema.fields.map((field) =>
|
|
154
|
-
nodeBuilder({
|
|
155
|
-
controlSchema: field,
|
|
156
|
-
parentId: `fieldset-${parentId}-${field.id}`,
|
|
157
|
-
internalContext,
|
|
158
|
-
bladeContext,
|
|
159
|
-
currentLocale,
|
|
160
|
-
formData,
|
|
161
|
-
}),
|
|
162
|
-
),
|
|
183
|
+
];
|
|
184
|
+
}, [] as VNode[]),
|
|
163
185
|
];
|
|
164
186
|
});
|
|
165
187
|
|
|
166
188
|
const elProps = {
|
|
167
189
|
baseProps,
|
|
168
|
-
baseOptions,
|
|
169
190
|
bladeContext,
|
|
170
191
|
element: controlSchema,
|
|
171
192
|
currentLocale: unref(currentLocale),
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ControlSchema } from "./../types/index";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { ComputedRef, toValue } from "vue";
|
|
4
|
+
|
|
5
|
+
export const visibilityHandler = (
|
|
6
|
+
visibility:
|
|
7
|
+
| ComputedRef<boolean | undefined>
|
|
8
|
+
| ((schema: ControlSchema, fieldContext: Record<string, any> | undefined) => boolean)
|
|
9
|
+
| undefined,
|
|
10
|
+
fieldContext: Record<string, any> | undefined,
|
|
11
|
+
schema: ControlSchema,
|
|
12
|
+
) => {
|
|
13
|
+
if (visibility === undefined) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (typeof visibility === "function") {
|
|
18
|
+
return visibility(schema, fieldContext);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return toValue(visibility);
|
|
22
|
+
};
|
|
@@ -9,6 +9,7 @@ import { kebabToPascal } from "../../../core/utilities";
|
|
|
9
9
|
import { BladeInstanceConstructor } from "../../index";
|
|
10
10
|
import { createAppModule } from "../../../core/plugins";
|
|
11
11
|
import { ComponentProps } from "./../../utilities/vueUtils";
|
|
12
|
+
import { Router } from "vue-router";
|
|
12
13
|
|
|
13
14
|
interface Registered {
|
|
14
15
|
component: BladeInstanceConstructor;
|
|
@@ -138,7 +139,7 @@ export const createDynamicAppModule = (args: {
|
|
|
138
139
|
}
|
|
139
140
|
|
|
140
141
|
return {
|
|
141
|
-
install(app: App, options: { router:
|
|
142
|
+
install(app: App, options: { router: Router }) {
|
|
142
143
|
const bladePages = { ...pages };
|
|
143
144
|
const appModuleContent = {
|
|
144
145
|
locales: args?.locales,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
v-loading="loading"
|
|
5
5
|
:expanded="expanded"
|
|
6
6
|
:closable="closable"
|
|
7
|
-
width="50%"
|
|
7
|
+
:width="settings?.width || '50%'"
|
|
8
8
|
:toolbar-items="toolbarComputed"
|
|
9
9
|
:title="title"
|
|
10
10
|
@close="$emit('close:blade')"
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
<div class="item-details__content">
|
|
34
34
|
<VcForm class="tw-grow tw-p-4">
|
|
35
35
|
<SchemaRender
|
|
36
|
+
:key="`${loading}`"
|
|
36
37
|
v-model="item"
|
|
37
38
|
:ui-schema="form.children"
|
|
38
39
|
:context="bladeContext"
|
|
@@ -78,6 +79,7 @@ import {
|
|
|
78
79
|
ComputedRef,
|
|
79
80
|
type Component,
|
|
80
81
|
ConcreteComponent,
|
|
82
|
+
toRefs,
|
|
81
83
|
} from "vue";
|
|
82
84
|
import { DynamicDetailsSchema, FormContentSchema, SettingsSchema } from "../types";
|
|
83
85
|
import { reactiveComputed, useMounted, useTemplateRefsList } from "@vueuse/core";
|
|
@@ -92,10 +94,11 @@ import {
|
|
|
92
94
|
} from "../../../index";
|
|
93
95
|
import SchemaRender from "../components/SchemaRender";
|
|
94
96
|
import { VcSelect } from "../../../../ui/components";
|
|
95
|
-
import {
|
|
97
|
+
import { useToolbarReducer } from "../composables/useToolbarReducer";
|
|
96
98
|
import { useBeforeUnload } from "../../../../core/composables/useBeforeUnload";
|
|
97
99
|
import * as _ from "lodash-es";
|
|
98
100
|
import { IBladeToolbar } from "../../../../core/types";
|
|
101
|
+
import { toRef } from "vue";
|
|
99
102
|
|
|
100
103
|
interface Props {
|
|
101
104
|
expanded?: boolean;
|
|
@@ -239,56 +242,58 @@ const bladeOptions = reactive({
|
|
|
239
242
|
});
|
|
240
243
|
|
|
241
244
|
const toolbarComputed =
|
|
242
|
-
props.composables &&
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
emit("parent:call", {
|
|
252
|
-
method: "reload",
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
emit("parent:call", {
|
|
256
|
-
method: "updateActiveWidgetCount",
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
if (!props.param) {
|
|
260
|
-
emit("close:blade");
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
},
|
|
264
|
-
disabled: computed(() => !validationState.value.modified),
|
|
265
|
-
},
|
|
266
|
-
remove: {
|
|
267
|
-
async clickHandler() {
|
|
268
|
-
if (
|
|
269
|
-
await showConfirmation(
|
|
270
|
-
computed(() => t(`${settings.value?.localizationPrefix.trim().toUpperCase()}.PAGES.ALERTS.DELETE`)),
|
|
271
|
-
)
|
|
272
|
-
) {
|
|
273
|
-
if (props.param) {
|
|
274
|
-
await remove?.({ id: props.param });
|
|
245
|
+
(props.composables &&
|
|
246
|
+
useToolbarReducer({
|
|
247
|
+
defaultToolbarSchema: settings.value?.toolbar ?? [],
|
|
248
|
+
defaultToolbarBindings: {
|
|
249
|
+
saveChanges: {
|
|
250
|
+
async clickHandler() {
|
|
251
|
+
if (item.value) {
|
|
252
|
+
await saveChanges(item.value);
|
|
253
|
+
|
|
275
254
|
emit("parent:call", {
|
|
276
255
|
method: "reload",
|
|
277
256
|
});
|
|
257
|
+
|
|
278
258
|
emit("parent:call", {
|
|
279
259
|
method: "updateActiveWidgetCount",
|
|
280
260
|
});
|
|
281
261
|
|
|
282
|
-
|
|
262
|
+
if (!props.param) {
|
|
263
|
+
emit("close:blade");
|
|
264
|
+
}
|
|
283
265
|
}
|
|
284
|
-
}
|
|
266
|
+
},
|
|
267
|
+
disabled: computed(() => !validationState.value.modified),
|
|
268
|
+
},
|
|
269
|
+
remove: {
|
|
270
|
+
async clickHandler() {
|
|
271
|
+
if (
|
|
272
|
+
await showConfirmation(
|
|
273
|
+
computed(() => t(`${settings.value?.localizationPrefix.trim().toUpperCase()}.PAGES.ALERTS.DELETE`)),
|
|
274
|
+
)
|
|
275
|
+
) {
|
|
276
|
+
if (props.param) {
|
|
277
|
+
await remove?.({ id: props.param });
|
|
278
|
+
emit("parent:call", {
|
|
279
|
+
method: "reload",
|
|
280
|
+
});
|
|
281
|
+
emit("parent:call", {
|
|
282
|
+
method: "updateActiveWidgetCount",
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
emit("close:blade");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
disabled: computed(() => toValue(scope)?.disabled),
|
|
285
290
|
},
|
|
286
|
-
disabled: computed(() => toValue(scope)?.disabled),
|
|
287
291
|
},
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
+
customToolbarConfig: toValue(scope)?.toolbarOverrides,
|
|
293
|
+
context: bladeContext.value,
|
|
294
|
+
scope,
|
|
295
|
+
})) ??
|
|
296
|
+
[];
|
|
292
297
|
|
|
293
298
|
async function setActiveWidget(widget: string | ConcreteComponent) {
|
|
294
299
|
const component = typeof widget === "string" ? resolveComponent(widget) : widget;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
v-if="!composables"
|
|
5
5
|
:expanded="expanded"
|
|
6
6
|
:closable="closable"
|
|
7
|
-
width="50%"
|
|
7
|
+
:width="settings?.width || '50%'"
|
|
8
8
|
:toolbar-items="toolbarComputed"
|
|
9
9
|
:title="title"
|
|
10
10
|
:class="{
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
|
|
63
63
|
<!-- Not found template -->
|
|
64
64
|
<template #notfound>
|
|
65
|
-
<template v-if="
|
|
65
|
+
<template v-if="tableTemplates?.notFound">
|
|
66
66
|
<component
|
|
67
|
-
:is="
|
|
67
|
+
:is="tableTemplates.notFound"
|
|
68
68
|
@reset="resetSearch"
|
|
69
69
|
></component>
|
|
70
70
|
</template>
|
|
@@ -84,9 +84,9 @@
|
|
|
84
84
|
|
|
85
85
|
<!-- Empty template -->
|
|
86
86
|
<template #empty>
|
|
87
|
-
<template v-if="
|
|
87
|
+
<template v-if="tableTemplates?.empty">
|
|
88
88
|
<component
|
|
89
|
-
:is="
|
|
89
|
+
:is="tableTemplates.empty"
|
|
90
90
|
:class="{
|
|
91
91
|
'tw-py-6': isWidgetView,
|
|
92
92
|
}"
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
|
|
105
105
|
<!-- Override table templates-->
|
|
106
106
|
<template
|
|
107
|
-
v-for="(component, key, index) in
|
|
107
|
+
v-for="(component, key, index) in tableTemplates?.templateOverrideComponents"
|
|
108
108
|
#[`item_${key}`]="itemData"
|
|
109
109
|
:key="`template_override_${index}`"
|
|
110
110
|
>
|
|
@@ -117,11 +117,11 @@
|
|
|
117
117
|
<!-- Override table mobile view -->
|
|
118
118
|
|
|
119
119
|
<template
|
|
120
|
-
v-if="
|
|
120
|
+
v-if="tableTemplates?.mobileView"
|
|
121
121
|
#mobile-item="itemData"
|
|
122
122
|
>
|
|
123
123
|
<component
|
|
124
|
-
:is="
|
|
124
|
+
:is="tableTemplates.mobileView"
|
|
125
125
|
:context="itemData"
|
|
126
126
|
></component>
|
|
127
127
|
</template>
|
|
@@ -137,23 +137,20 @@ import {
|
|
|
137
137
|
inject,
|
|
138
138
|
reactive,
|
|
139
139
|
ref,
|
|
140
|
-
resolveComponent,
|
|
141
140
|
shallowRef,
|
|
142
141
|
toValue,
|
|
143
142
|
unref,
|
|
144
143
|
watch,
|
|
145
144
|
UnwrapRef,
|
|
146
|
-
ShallowRef,
|
|
147
|
-
ConcreteComponent,
|
|
148
145
|
ComputedRef,
|
|
149
146
|
onBeforeMount,
|
|
150
147
|
} from "vue";
|
|
151
148
|
import { useI18n } from "vue-i18n";
|
|
152
149
|
import { DynamicGridSchema, ListContentSchema, SettingsSchema } from "../types";
|
|
153
|
-
import { useFilterBuilder } from "../composables";
|
|
150
|
+
import { useFilterBuilder, useTableTemplates } from "../composables";
|
|
154
151
|
import { useFunctions, useNotifications } from "../../../../core/composables";
|
|
155
152
|
import { ITableColumns } from "../../../../core/types";
|
|
156
|
-
import {
|
|
153
|
+
import { useToolbarReducer } from "../composables/useToolbarReducer";
|
|
157
154
|
import { notification, usePopup } from "../../../components";
|
|
158
155
|
import { ListBaseBladeScope, ListBladeContext, UseList } from "../factories/types";
|
|
159
156
|
import { IParentCallArgs } from "../../../index";
|
|
@@ -231,7 +228,7 @@ const stateKey =
|
|
|
231
228
|
props.composables &&
|
|
232
229
|
computed(() => {
|
|
233
230
|
if (tableData?.value?.id) {
|
|
234
|
-
return tableData.value?.id
|
|
231
|
+
return tableData.value?.id && props.isWidgetView ? tableData.value?.id + "_dashboard" : tableData.value?.id;
|
|
235
232
|
}
|
|
236
233
|
|
|
237
234
|
throw new Error('Table id is not defined. Please provide "id" property in table schema');
|
|
@@ -257,6 +254,8 @@ if (props.isWidgetView) {
|
|
|
257
254
|
query.value.take = 5;
|
|
258
255
|
}
|
|
259
256
|
|
|
257
|
+
const { tableTemplates } = useTableTemplates(tableData);
|
|
258
|
+
|
|
260
259
|
const calculateColumns = (columns: ListContentSchema["columns"]) => {
|
|
261
260
|
const result = columns?.map((column) => {
|
|
262
261
|
if (typeof column.visible !== "boolean" && column.visible?.method) {
|
|
@@ -286,10 +285,6 @@ const table =
|
|
|
286
285
|
const bladeOptions = reactive({
|
|
287
286
|
tableData,
|
|
288
287
|
table,
|
|
289
|
-
templateOverrideComponents: templateOverrideComponents(),
|
|
290
|
-
mobileView: resolveTemplateComponent("mobileTemplate"),
|
|
291
|
-
notFound: resolveTemplateComponent("notFoundTemplate"),
|
|
292
|
-
empty: resolveTemplateComponent("emptyTemplate"),
|
|
293
288
|
});
|
|
294
289
|
|
|
295
290
|
const {
|
|
@@ -316,44 +311,46 @@ const bladeContext = ref<ListBladeContext>({
|
|
|
316
311
|
});
|
|
317
312
|
|
|
318
313
|
const toolbarComputed =
|
|
319
|
-
props.composables &&
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
314
|
+
(props.composables &&
|
|
315
|
+
useToolbarReducer({
|
|
316
|
+
defaultToolbarSchema: settings.value?.toolbar ?? [],
|
|
317
|
+
defaultToolbarBindings: {
|
|
318
|
+
save: {
|
|
319
|
+
clickHandler() {
|
|
320
|
+
emit("close:blade");
|
|
321
|
+
},
|
|
322
|
+
disabled: computed(() => !modified.value),
|
|
326
323
|
},
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
} else throw new Error("openDetailsBlade method is not defined in scope");
|
|
324
|
+
openAddBlade: {
|
|
325
|
+
async clickHandler() {
|
|
326
|
+
if (
|
|
327
|
+
scope &&
|
|
328
|
+
"openDetailsBlade" in toValue(scope) &&
|
|
329
|
+
toValue(scope).openDetailsBlade &&
|
|
330
|
+
typeof toValue(scope).openDetailsBlade === "function"
|
|
331
|
+
) {
|
|
332
|
+
toValue(scope).openDetailsBlade();
|
|
333
|
+
} else throw new Error("openDetailsBlade method is not defined in scope");
|
|
334
|
+
},
|
|
339
335
|
},
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
336
|
+
refresh: {
|
|
337
|
+
async clickHandler() {
|
|
338
|
+
await reload();
|
|
339
|
+
},
|
|
344
340
|
},
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
341
|
+
removeItems: {
|
|
342
|
+
async clickHandler() {
|
|
343
|
+
await removeItems();
|
|
344
|
+
},
|
|
345
|
+
disabled: computed(() => !selectedIds.value?.length),
|
|
346
|
+
isVisible: isDesktop.value,
|
|
349
347
|
},
|
|
350
|
-
disabled: computed(() => !selectedIds.value?.length),
|
|
351
|
-
isVisible: isDesktop.value,
|
|
352
348
|
},
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
349
|
+
customToolbarConfig: toValue(scope)?.toolbarOverrides,
|
|
350
|
+
context: bladeContext.value,
|
|
351
|
+
scope,
|
|
352
|
+
})) ??
|
|
353
|
+
[];
|
|
357
354
|
|
|
358
355
|
onBeforeMount(async () => {
|
|
359
356
|
if (props.composables) await load({ ...query.value, sort: sort.value });
|
|
@@ -545,43 +542,6 @@ async function resetSearch() {
|
|
|
545
542
|
});
|
|
546
543
|
}
|
|
547
544
|
|
|
548
|
-
function templateOverrideComponents(): Record<string, ShallowRef<ConcreteComponent>> {
|
|
549
|
-
return {
|
|
550
|
-
...table?.value.columns?.reduce(
|
|
551
|
-
(acc, curr) => {
|
|
552
|
-
if ("customTemplate" in curr && curr.customTemplate) {
|
|
553
|
-
if (!("component" in curr.customTemplate)) {
|
|
554
|
-
throw new Error(
|
|
555
|
-
`Component name must be provided in 'customTemplate' property, column: ${JSON.stringify(curr)}`,
|
|
556
|
-
);
|
|
557
|
-
} else if ("component" in curr.customTemplate && curr.customTemplate.component) {
|
|
558
|
-
const component = resolveComponent(curr.customTemplate.component);
|
|
559
|
-
|
|
560
|
-
if (typeof component !== "string") {
|
|
561
|
-
acc[curr.id] = shallowRef(component);
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
return acc;
|
|
566
|
-
},
|
|
567
|
-
{} as Record<string, ShallowRef<ConcreteComponent>>,
|
|
568
|
-
),
|
|
569
|
-
};
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
function resolveTemplateComponent(name: keyof ListContentSchema) {
|
|
573
|
-
if (!tableData?.value) return;
|
|
574
|
-
const value = tableData.value[name];
|
|
575
|
-
if (value && typeof value === "object" && "component" in value) {
|
|
576
|
-
const componentName = value.component;
|
|
577
|
-
if (componentName) {
|
|
578
|
-
const component = resolveComponent(componentName);
|
|
579
|
-
|
|
580
|
-
if (component && typeof component !== "string") return shallowRef(component);
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
|
|
585
545
|
function sortRows(event: { dragIndex: number; dropIndex: number; value: any[] }) {
|
|
586
546
|
if (event.dragIndex !== event.dropIndex) {
|
|
587
547
|
const sorted = event.value.map((item, index) => {
|