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