@ditojs/admin 2.75.2 → 2.77.0
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/dito-admin.es.js +922 -900
- package/dist/dito-admin.umd.js +5 -5
- package/package.json +5 -5
- package/src/DitoContext.js +7 -4
- package/src/components/DitoCreateButton.vue +6 -1
- package/src/components/DitoRoot.vue +2 -2
- package/src/components/DitoSchema.vue +4 -1
- package/src/mixins/SourceMixin.js +17 -3
- package/src/types/DitoTypeList.vue +3 -3
- package/src/types/DitoTypeMultiselect.vue +3 -3
- package/src/types/DitoTypeObject.vue +1 -1
- package/src/types/DitoTypeTreeList.vue +3 -2
- package/src/utils/schema.js +7 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ditojs/admin",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.77.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Dito.js Admin is a schema based admin interface for Dito.js Server, featuring auto-generated views and forms and built with Vue.js",
|
|
6
6
|
"repository": "https://github.com/ditojs/dito/tree/master/packages/admin",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"not ie_mob > 0"
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@ditojs/ui": "^2.
|
|
46
|
-
"@ditojs/utils": "^2.
|
|
45
|
+
"@ditojs/ui": "^2.77.0",
|
|
46
|
+
"@ditojs/utils": "^2.77.0",
|
|
47
47
|
"@kyvg/vue3-notification": "^3.4.2",
|
|
48
48
|
"@lk77/vue3-color": "^3.0.6",
|
|
49
49
|
"@tiptap/core": "^3.15.3",
|
|
@@ -89,9 +89,9 @@
|
|
|
89
89
|
"vue-upload-component": "^3.1.17"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
|
-
"@ditojs/build": "^2.
|
|
92
|
+
"@ditojs/build": "^2.77.0",
|
|
93
93
|
"typescript": "^5.9.3",
|
|
94
94
|
"vite": "^7.3.1"
|
|
95
95
|
},
|
|
96
|
-
"gitHead": "
|
|
96
|
+
"gitHead": "d2cff77924d989aad5ab601cf08433a4e683ac6d"
|
|
97
97
|
}
|
package/src/DitoContext.js
CHANGED
|
@@ -260,10 +260,9 @@ export default class DitoContext {
|
|
|
260
260
|
return get(this, 'open', undefined)
|
|
261
261
|
}
|
|
262
262
|
|
|
263
|
-
//
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
return get(this, 'query', undefined)
|
|
263
|
+
// For search term in selects:
|
|
264
|
+
get searchTerm() {
|
|
265
|
+
return get(this, 'searchTerm', undefined)
|
|
267
266
|
}
|
|
268
267
|
|
|
269
268
|
// The error field is only populated in the context of buttons that send
|
|
@@ -284,6 +283,10 @@ export default class DitoContext {
|
|
|
284
283
|
set(this, 'isRunning', value)
|
|
285
284
|
}
|
|
286
285
|
|
|
286
|
+
get query() {
|
|
287
|
+
return this.component.$route.query
|
|
288
|
+
}
|
|
289
|
+
|
|
287
290
|
// Helper Methods
|
|
288
291
|
|
|
289
292
|
get request() {
|
|
@@ -105,9 +105,14 @@ export default DitoComponent.component('DitoCreateButton', {
|
|
|
105
105
|
if (this.isInlined) {
|
|
106
106
|
this.sourceComponent.createItem(form, type)
|
|
107
107
|
} else {
|
|
108
|
+
const { creatable } = this.schema
|
|
109
|
+
const query = {
|
|
110
|
+
...(type && { type }),
|
|
111
|
+
...creatable?.query?.(this.context)
|
|
112
|
+
}
|
|
108
113
|
this.$router.push({
|
|
109
114
|
path: `${this.path}/create`,
|
|
110
|
-
query
|
|
115
|
+
query
|
|
111
116
|
})
|
|
112
117
|
}
|
|
113
118
|
} else {
|
|
@@ -231,8 +231,8 @@ export default DitoComponent.component('DitoRoot', {
|
|
|
231
231
|
})
|
|
232
232
|
},
|
|
233
233
|
|
|
234
|
-
notify({ type = 'info', title, text, error } = {}) {
|
|
235
|
-
this.notifications.notify({ type, title, text, error })
|
|
234
|
+
notify({ type = 'info', title, text, error, duration } = {}) {
|
|
235
|
+
this.notifications.notify({ type, title, text, error, duration })
|
|
236
236
|
},
|
|
237
237
|
|
|
238
238
|
closeNotifications() {
|
|
@@ -396,7 +396,10 @@ export default DitoComponent.component('DitoSchema', {
|
|
|
396
396
|
const tab = this.shouldRenderSchema(this.tabs[newTab])
|
|
397
397
|
? newTab
|
|
398
398
|
: this.defaultTab
|
|
399
|
-
this.$router.replace({
|
|
399
|
+
this.$router.replace({
|
|
400
|
+
query: this.$route.query,
|
|
401
|
+
hash: tab ? `#${tab}` : null
|
|
402
|
+
})
|
|
400
403
|
}
|
|
401
404
|
if (this.hasErrors) {
|
|
402
405
|
this.repositionErrors()
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
hasFormSchema,
|
|
14
14
|
getFormSchemas,
|
|
15
15
|
getViewSchema,
|
|
16
|
+
getViewPath,
|
|
16
17
|
isCompact,
|
|
17
18
|
isInlined,
|
|
18
19
|
isObjectSource,
|
|
@@ -187,13 +188,16 @@ export default {
|
|
|
187
188
|
// the route query parameters to override them.
|
|
188
189
|
const {
|
|
189
190
|
scope = this.defaultScope?.name,
|
|
190
|
-
page = this.schema.page
|
|
191
|
+
page = this.schema.page,
|
|
192
|
+
type
|
|
191
193
|
} = this.query
|
|
192
|
-
// Preserve / merge currently stored values
|
|
194
|
+
// Preserve / merge currently stored values, including any custom query
|
|
195
|
+
// parameters added by creatable.query
|
|
193
196
|
query = {
|
|
194
197
|
...this.query,
|
|
195
198
|
...(scope != null && { scope }),
|
|
196
199
|
...(page != null && { page }),
|
|
200
|
+
...(type != null && { type }),
|
|
197
201
|
...query
|
|
198
202
|
}
|
|
199
203
|
if (!equals(query, this.$route.query)) {
|
|
@@ -337,7 +341,17 @@ export default {
|
|
|
337
341
|
maxDepth: getSchemaAccessor('maxDepth', {
|
|
338
342
|
type: Number,
|
|
339
343
|
default: 1
|
|
340
|
-
})
|
|
344
|
+
}),
|
|
345
|
+
|
|
346
|
+
createPath() {
|
|
347
|
+
if (this.creatable) {
|
|
348
|
+
return (
|
|
349
|
+
getViewPath(this.schema, this.context) ||
|
|
350
|
+
this.path
|
|
351
|
+
)
|
|
352
|
+
}
|
|
353
|
+
return null
|
|
354
|
+
}
|
|
341
355
|
},
|
|
342
356
|
|
|
343
357
|
watch: {
|
|
@@ -107,6 +107,7 @@
|
|
|
107
107
|
v-if="hasCellEditButtons"
|
|
108
108
|
)
|
|
109
109
|
DitoEditButtons(
|
|
110
|
+
nested
|
|
110
111
|
:schema="getItemFormSchema(schema, item, context)"
|
|
111
112
|
:dataPath="getDataPath(index)"
|
|
112
113
|
:data="item"
|
|
@@ -132,10 +133,9 @@
|
|
|
132
133
|
:data="listData"
|
|
133
134
|
:meta="meta"
|
|
134
135
|
:store="store"
|
|
135
|
-
:nested="nested"
|
|
136
136
|
:disabled="disabled || isLoading"
|
|
137
137
|
:creatable="creatable"
|
|
138
|
-
:createPath="
|
|
138
|
+
:createPath="createPath"
|
|
139
139
|
)
|
|
140
140
|
//- Render create buttons outside table when in a single component view:
|
|
141
141
|
DitoEditButtons.dito-buttons--large.dito-buttons--main.dito-buttons--sticky(
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
:store="store"
|
|
149
149
|
:disabled="disabled || isLoading"
|
|
150
150
|
:creatable="creatable"
|
|
151
|
-
:createPath="
|
|
151
|
+
:createPath="createPath"
|
|
152
152
|
)
|
|
153
153
|
</template>
|
|
154
154
|
|
|
@@ -222,14 +222,14 @@ export default DitoTypeComponent.register('multiselect', {
|
|
|
222
222
|
}
|
|
223
223
|
},
|
|
224
224
|
|
|
225
|
-
async onSearchChange(
|
|
225
|
+
async onSearchChange(searchTerm) {
|
|
226
226
|
if (this.searchFilter) {
|
|
227
|
-
if (
|
|
227
|
+
if (searchTerm) {
|
|
228
228
|
// Set `searchedOptions` to an empty array, before it will be
|
|
229
229
|
// populated asynchronously with the actual results.
|
|
230
230
|
this.searchedOptions = []
|
|
231
231
|
this.searchedOptions = await this.resolveData(
|
|
232
|
-
() => this.searchFilter(new DitoContext(this, {
|
|
232
|
+
() => this.searchFilter(new DitoContext(this, { searchTerm }))
|
|
233
233
|
)
|
|
234
234
|
} else {
|
|
235
235
|
// Clear `searchedOptions` when the query is cleared.
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
@update:data="data => (value = data)"
|
|
16
16
|
)
|
|
17
17
|
.dito-tree-form-container(
|
|
18
|
-
v-if="hasEditableForms"
|
|
18
|
+
v-if="editPath && hasEditableForms"
|
|
19
19
|
)
|
|
20
20
|
//- Include a router-view for the optional DitoFormInlined
|
|
21
21
|
RouterView
|
|
@@ -52,7 +52,8 @@ export default DitoTypeComponent.register(
|
|
|
52
52
|
|
|
53
53
|
editPath() {
|
|
54
54
|
// Accessed from DitoTreeItem through `container.editPath`:
|
|
55
|
-
|
|
55
|
+
const path = this.$route.path.slice(this.path?.length)
|
|
56
|
+
return path.startsWith(`/${this.schema.path}`) ? path : ''
|
|
56
57
|
},
|
|
57
58
|
|
|
58
59
|
treeData() {
|
package/src/utils/schema.js
CHANGED
|
@@ -491,17 +491,21 @@ export function hasViewSchema(schema, context) {
|
|
|
491
491
|
return !!getViewSchema(schema, context)
|
|
492
492
|
}
|
|
493
493
|
|
|
494
|
-
export function
|
|
494
|
+
export function getViewPath(schema, context) {
|
|
495
495
|
const view = getViewSchema(schema, context)
|
|
496
496
|
if (view) {
|
|
497
|
-
|
|
497
|
+
return isSingleComponentView(view)
|
|
498
498
|
? view.fullPath
|
|
499
499
|
: `${view.fullPath}/${view.path}`
|
|
500
|
-
return `${path}/${id}`
|
|
501
500
|
}
|
|
502
501
|
return null
|
|
503
502
|
}
|
|
504
503
|
|
|
504
|
+
export function getViewEditPath(schema, id, context) {
|
|
505
|
+
const path = getViewPath(schema, context)
|
|
506
|
+
return path ? `${path}/${id}` : null
|
|
507
|
+
}
|
|
508
|
+
|
|
505
509
|
export function getFormSchemas(schema, context, modifyForm) {
|
|
506
510
|
const viewSchema = context && getViewFormSchema(schema, context)
|
|
507
511
|
if (viewSchema) {
|