@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ditojs/admin",
3
- "version": "2.75.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.75.0",
46
- "@ditojs/utils": "^2.75.0",
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.75.0",
92
+ "@ditojs/build": "^2.77.0",
93
93
  "typescript": "^5.9.3",
94
94
  "vite": "^7.3.1"
95
95
  },
96
- "gitHead": "70ff8a3042925a27c2b2a792505db04038f92493"
96
+ "gitHead": "d2cff77924d989aad5ab601cf08433a4e683ac6d"
97
97
  }
@@ -260,10 +260,9 @@ export default class DitoContext {
260
260
  return get(this, 'open', undefined)
261
261
  }
262
262
 
263
- // TODO: Rename this to `searchTerm` or `searchQuery`, to perhaps free `query`
264
- // for the actual `resourceComponent.query` object?
265
- get query() {
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: { type }
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({ hash: tab ? `#${tab}` : null })
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="path"
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="path"
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(query) {
225
+ async onSearchChange(searchTerm) {
226
226
  if (this.searchFilter) {
227
- if (query) {
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, { query }))
232
+ () => this.searchFilter(new DitoContext(this, { searchTerm }))
233
233
  )
234
234
  } else {
235
235
  // Clear `searchedOptions` when the query is cleared.
@@ -51,7 +51,7 @@
51
51
  :store="store"
52
52
  :disabled="disabled || isLoading"
53
53
  :creatable="creatable"
54
- :createPath="path"
54
+ :createPath="createPath"
55
55
  )
56
56
  </template>
57
57
 
@@ -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
- return this.$route.path.slice(this.path?.length)
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() {
@@ -491,17 +491,21 @@ export function hasViewSchema(schema, context) {
491
491
  return !!getViewSchema(schema, context)
492
492
  }
493
493
 
494
- export function getViewEditPath(schema, id, context) {
494
+ export function getViewPath(schema, context) {
495
495
  const view = getViewSchema(schema, context)
496
496
  if (view) {
497
- const path = isSingleComponentView(view)
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) {