diff --git a/client/web/compose/src/components/ModuleFields/Editor/Record.vue b/client/web/compose/src/components/ModuleFields/Editor/Record.vue
index b70b0351f..0f751cb23 100644
--- a/client/web/compose/src/components/ModuleFields/Editor/Record.vue
+++ b/client/web/compose/src/components/ModuleFields/Editor/Record.vue
@@ -40,85 +40,119 @@
:show-list="field.options.selectType !== 'multiple'"
>
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -207,6 +257,7 @@ export default {
getModuleByID: 'module/getByID',
findUserByID: 'user/findByID',
findRecordsByIDs: 'record/findByIDs',
+ pages: 'page/set',
}),
options () {
@@ -262,6 +313,12 @@ export default {
hasNextPage () {
return !!this.filter.nextPage
},
+
+ canAddRecordThroughSelectField () {
+ if (this.module === undefined) return
+
+ return !!this.getRecordSelectorPage().page.pageID && this.module.canCreateRecord
+ },
},
watch: {
@@ -303,6 +360,7 @@ export default {
createEvents () {
this.$root.$on('record-field-change', this.refetchOnPrefilterValueChange)
+ this.$root.$on('module-records-updated', this.refreshOnRelatedRecordsUpdate)
},
refetchOnPrefilterValueChange ({ fieldName }) {
@@ -500,6 +558,55 @@ export default {
})
},
+ addRecordThroughRecordSelectField () {
+ const { page } = this.getRecordSelectorPage()
+
+ if (page === undefined) return
+
+ const { pageID } = page
+ const { recordSelectorAddRecordDisplayOption } = this.extraOptions
+
+ const route = {
+ name: 'page.record.create',
+ params: { pageID, edit: true },
+ }
+
+ if (recordSelectorAddRecordDisplayOption === 'modal') {
+ this.$root.$emit('show-record-modal', {
+ recordID: NoID,
+ recordPageID: pageID,
+ edit: true,
+ })
+ } else if (recordSelectorAddRecordDisplayOption === 'newTab') {
+ window.open(this.$router.resolve(route).href)
+ } else {
+ this.$router.push(route)
+ }
+ },
+
+ refreshOnRelatedRecordsUpdate () {
+ const { page } = this.getRecordSelectorPage()
+ if (page === undefined || this.module === undefined) return
+
+ if (page.pageID !== this.$route.params.pageID) {
+ this.loadLatest()
+ }
+ },
+
+ getRecordSelectorPage () {
+ const recordFieldModuleID = this.field.options.moduleID
+
+ if (!recordFieldModuleID) return
+
+ const recordFieldPage = this.pages.find(p => p.moduleID === recordFieldModuleID)
+
+ if (!recordFieldPage) return
+
+ return {
+ page: recordFieldPage,
+ }
+ },
+
selectChange ({ recordID } = {}) {
if (!recordID) return
@@ -535,6 +642,7 @@ export default {
destroyEvents () {
this.$root.$off('record-field-change', this.refetchOnPrefilterValueChange)
+ this.$root.$off('module-records-updated', this.refreshOnRelatedRecordsUpdate)
},
setDefaultValues () {
diff --git a/client/web/compose/src/components/ModuleFields/Editor/base.vue b/client/web/compose/src/components/ModuleFields/Editor/base.vue
index 078d85dcd..ec0b1cf5b 100644
--- a/client/web/compose/src/components/ModuleFields/Editor/base.vue
+++ b/client/web/compose/src/components/ModuleFields/Editor/base.vue
@@ -57,6 +57,11 @@ export default {
type: Boolean,
default: false,
},
+
+ extraOptions: {
+ type: Object,
+ default: () => ({}),
+ },
},
computed: {
diff --git a/client/web/compose/src/components/PageBlocks/RecordConfigurator.vue b/client/web/compose/src/components/PageBlocks/RecordConfigurator.vue
index 9d3701ec3..b79e86bb8 100644
--- a/client/web/compose/src/components/PageBlocks/RecordConfigurator.vue
+++ b/client/web/compose/src/components/PageBlocks/RecordConfigurator.vue
@@ -23,6 +23,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
@@ -277,6 +311,10 @@ export default {
this.options.inlineRecordEditEnabled = v
},
},
+
+ isRecordConfigured () {
+ return this.module.fields.some(f => f.kind === 'Record')
+ },
},
created () {
diff --git a/client/web/compose/src/components/PageBlocks/RecordEditor.vue b/client/web/compose/src/components/PageBlocks/RecordEditor.vue
index 4211b3f80..1607f2f13 100644
--- a/client/web/compose/src/components/PageBlocks/RecordEditor.vue
+++ b/client/web/compose/src/components/PageBlocks/RecordEditor.vue
@@ -26,6 +26,7 @@
v-bind="{ ...$props, errors: fieldErrors(field.name) }"
:horizontal="horizontal"
:field="field"
+ :extra-options="options"
@change="onFieldChange(field)"
/>
diff --git a/lib/js/src/compose/types/page-block/record.ts b/lib/js/src/compose/types/page-block/record.ts
index 8a54bb041..51b34c8ad 100644
--- a/lib/js/src/compose/types/page-block/record.ts
+++ b/lib/js/src/compose/types/page-block/record.ts
@@ -11,8 +11,10 @@ interface FieldCondition {
interface Options {
fields: unknown[];
fieldConditions: FieldCondition[];
+ recordSelectorShowAddRecordButton: boolean;
magnifyOption: string;
recordSelectorDisplayOption: string;
+ recordSelectorAddRecordDisplayOption: string;
referenceField?: string;
referenceModuleID?: string;
inlineRecordEditEnabled: boolean;
@@ -22,8 +24,10 @@ interface Options {
const defaults: Readonly = Object.freeze({
fields: [],
fieldConditions: [],
+ recordSelectorShowAddRecordButton: false,
magnifyOption: '',
recordSelectorDisplayOption: 'sameTab',
+ recordSelectorAddRecordDisplayOption: 'sameTab',
referenceField: '',
referenceModuleID: undefined,
inlineRecordEditEnabled: false,
@@ -43,8 +47,8 @@ export class PageBlockRecord extends PageBlock {
applyOptions (o?: Partial): void {
if (!o) return
- Apply(this.options, o, String, 'magnifyOption', 'recordSelectorDisplayOption', 'referenceField', 'referenceModuleID')
- Apply(this.options, o, Boolean, 'inlineRecordEditEnabled', 'horizontalFieldLayoutEnabled')
+ Apply(this.options, o, String, 'magnifyOption', 'recordSelectorDisplayOption', 'recordSelectorAddRecordDisplayOption', 'referenceField', 'referenceModuleID')
+ Apply(this.options, o, Boolean, 'recordSelectorShowAddRecordButton', 'inlineRecordEditEnabled', 'horizontalFieldLayoutEnabled')
if (o.fields) {
this.options.fields = o.fields
diff --git a/locale/en/corteza-webapp-compose/block.yaml b/locale/en/corteza-webapp-compose/block.yaml
index b97a0a7f4..d7df7a009 100644
--- a/locale/en/corteza-webapp-compose/block.yaml
+++ b/locale/en/corteza-webapp-compose/block.yaml
@@ -262,6 +262,7 @@ metric:
valueLabel: Value style
label: Metric
record:
+ add: Can create records via selector
referenceRecordField: Reference record field
referenceRecordFieldPlaceholder: Select reference record selector
referenceRecordFieldDescription: Multi value record selector fields are not available
@@ -282,7 +283,7 @@ record:
fieldsFromModule: Single record block, displaying fields ({{0}}) from module {{1}}
untitled: Untitled
recordDeleted: This record was deleted
- recordSelectorDisplayOptions: On record selector click
+ recordSelectorDisplayOptions: On record value click
openInSameTab: Open record in the same tab
openInNewTab: Open record in a new tab
openInModal: Open record in a modal
@@ -296,6 +297,7 @@ record:
condition: Condition
tooltip:
performance: Using conditional fields will impact performance
+ recordSelectorAddRecordDisplayOption: On selector record create
recordList:
addRecord: Add
cancelSelection: Cancel
@@ -526,7 +528,7 @@ recordList:
view: View
permissions: Permissions
recordDisplayOptions: On record click
- recordSelectorDisplayOptions: On record selector click
+ recordSelectorDisplayOptions: On record value click
addRecordOptions: On add record click
textStyles: Text Styles
configureNonWrappingFelids: Configure non-wrapping fields
diff --git a/locale/en/corteza-webapp-compose/field.yaml b/locale/en/corteza-webapp-compose/field.yaml
index 602b99201..7879652c7 100644
--- a/locale/en/corteza-webapp-compose/field.yaml
+++ b/locale/en/corteza-webapp-compose/field.yaml
@@ -129,6 +129,7 @@ kind:
prefilterPlaceholder: field1 = 1 AND field2 = 232
tooltip:
moduleField: Selecting a record field will impact performance
+ addRecord: Add a record
select:
allow-duplicates: Allow duplicates
label: Select