Add specific data type options for new table entry form

including basic FK / relationship support
This commit is contained in:
Lance Edgar 2023-01-16 22:50:51 -06:00
parent 98fa6eea05
commit e4c2336659
2 changed files with 166 additions and 21 deletions

View file

@ -118,7 +118,7 @@
v-slot="props"
% endif
>
{{ props.row.data_type }}
{{ formatDataType(props.row.data_type) }}
</b-table-column>
<b-table-column field="nullable"
@ -196,26 +196,89 @@
</b-input>
</b-field>
<b-field label="Data Type">
<b-input v-model="editingColumnDataType"></b-input>
<b-field grouped>
<b-field label="Data Type">
<b-select v-model="editingColumnDataType">
<option value="String">String</option>
<option value="Boolean">Boolean</option>
<option value="Integer">Integer</option>
<option value="Numeric">Numeric</option>
<option value="Date">Date</option>
<option value="DateTime">DateTime</option>
<option value="Text">Text</option>
<option value="_fk_uuid_">FK/UUID</option>
<option value="_other_">Other</option>
</b-select>
</b-field>
<b-field v-if="editingColumnDataType == 'String'"
label="Length"
:type="{'is-danger': !editingColumnDataTypeLength}"
style="max-width: 6rem;">
<b-input v-model="editingColumnDataTypeLength">
</b-input>
</b-field>
<b-field v-if="editingColumnDataType == 'Numeric'"
label="Precision"
:type="{'is-danger': !editingColumnDataTypePrecision}"
style="max-width: 6rem;">
<b-input v-model="editingColumnDataTypePrecision">
</b-input>
</b-field>
<b-field v-if="editingColumnDataType == 'Numeric'"
label="Scale"
:type="{'is-danger': !editingColumnDataTypeScale}"
style="max-width: 6rem;">
<b-input v-model="editingColumnDataTypeScale">
</b-input>
</b-field>
<b-field v-if="editingColumnDataType == '_fk_uuid_'"
label="Reference Table"
:type="{'is-danger': !editingColumnDataTypeReference}">
<b-select v-model="editingColumnDataTypeReference">
<option v-for="table in existingTables"
:key="table.name"
:value="table.name">
{{ table.name }}
</option>
</b-select>
</b-field>
<b-field v-if="editingColumnDataType == '_other_'"
label="Literal (include parens!)"
:type="{'is-danger': !editingColumnDataTypeLiteral}"
expanded>
<b-input v-model="editingColumnDataTypeLiteral">
</b-input>
</b-field>
</b-field>
<b-field grouped>
<b-field label="Nullable">
<b-checkbox v-model="editingColumnNullable"
native-value="true">
{{ editingColumnNullable }}
</b-checkbox>
</b-field>
<b-field label="Nullable">
<b-checkbox v-model="editingColumnNullable"
native-value="true">
{{ editingColumnNullable }}
</b-checkbox>
</b-field>
<b-field label="Versioned"
v-if="tableVersioned">
<b-checkbox v-model="editingColumnVersioned"
native-value="true">
{{ editingColumnVersioned }}
</b-checkbox>
</b-field>
<b-field label="Versioned"
v-if="tableVersioned">
<b-checkbox v-model="editingColumnVersioned"
native-value="true">
{{ editingColumnVersioned }}
</b-checkbox>
</b-field>
<b-field v-if="editingColumnDataType == '_fk_uuid_'"
label="Relationship">
<b-input v-model="editingColumnRelationship"></b-input>
</b-field>
</b-field>
@ -638,6 +701,8 @@
ThisPageData.activeStep = null
ThisPageData.alembicBranchOptions = ${json.dumps(branch_name_options)|n}
ThisPageData.existingTables = ${json.dumps(existing_tables)|n}
ThisPageData.alembicBranch = ${json.dumps(branch_name)|n}
ThisPageData.tableName = '${rattail_app.get_table_prefix()}_widget'
ThisPageData.tableModelName = '${rattail_app.get_class_prefix()}Widget'
@ -648,7 +713,10 @@
ThisPageData.tableColumns = [{
name: 'uuid',
data_type: 'String(length=32)',
data_type: {
type: 'String',
length: 32,
},
nullable: false,
description: "UUID primary key",
versioned: true,
@ -658,17 +726,29 @@
ThisPageData.editingColumn = null
ThisPageData.editingColumnName = null
ThisPageData.editingColumnDataType = null
ThisPageData.editingColumnDataTypeLength = null
ThisPageData.editingColumnDataTypePrecision = null
ThisPageData.editingColumnDataTypeScale = null
ThisPageData.editingColumnDataTypeReference = null
ThisPageData.editingColumnDataTypeLiteral = null
ThisPageData.editingColumnNullable = true
ThisPageData.editingColumnDescription = null
ThisPageData.editingColumnVersioned = true
ThisPageData.editingColumnRelationship = null
ThisPage.methods.tableAddColumn = function() {
this.editingColumn = null
this.editingColumnName = null
this.editingColumnDataType = null
this.editingColumnDataTypeLength = null
this.editingColumnDataTypePrecision = null
this.editingColumnDataTypeScale = null
this.editingColumnDataTypeReference = null
this.editingColumnDataTypeLiteral = null
this.editingColumnNullable = true
this.editingColumnDescription = null
this.editingColumnVersioned = true
this.editingColumnRelationship = null
this.editingColumnShowDialog = true
this.$nextTick(() => {
this.$refs.editingColumnName.focus()
@ -678,16 +758,43 @@
ThisPage.methods.tableEditColumn = function(column) {
this.editingColumn = column
this.editingColumnName = column.name
this.editingColumnDataType = column.data_type
this.editingColumnDataType = column.data_type.type
this.editingColumnDataTypeLength = column.data_type.length
this.editingColumnDataTypePrecision = column.data_type.precision
this.editingColumnDataTypeScale = column.data_type.scale
this.editingColumnDataTypeReference = column.data_type.reference
this.editingColumnDataTypeLiteral = column.data_type.literal
this.editingColumnNullable = column.nullable
this.editingColumnDescription = column.description
this.editingColumnVersioned = column.versioned
this.editingColumnRelationship = column.relationship
this.editingColumnShowDialog = true
this.$nextTick(() => {
this.$refs.editingColumnName.focus()
})
}
ThisPage.methods.formatDataType = function(dataType) {
if (dataType.type == 'String') {
return `sa.String(length=${'$'}{dataType.length})`
} else if (dataType.type == 'Numeric') {
return `sa.Numeric(precision=${'$'}{dataType.precision}, scale=${'$'}{dataType.scale})`
} else if (dataType.type == '_fk_uuid_') {
return 'sa.String(length=32)'
} else if (dataType.type == '_other_') {
return dataType.literal
} else {
return `sa.${'$'}{dataType.type}()`
}
}
ThisPage.watch.editingColumnDataTypeReference = function(newval, oldval) {
this.editingColumnRelationship = newval
if (newval && !this.editingColumnName) {
this.editingColumnName = `${'$'}{newval}_uuid`
}
}
ThisPage.methods.editingColumnSave = function() {
let column
if (this.editingColumn) {
@ -698,10 +805,24 @@
}
column.name = this.editingColumnName
column.data_type = this.editingColumnDataType
let dataType = {type: this.editingColumnDataType}
if (dataType.type == 'String') {
dataType.length = this.editingColumnDataTypeLength
} else if (dataType.type == 'Numeric') {
dataType.precision = this.editingColumnDataTypePrecision
dataType.scale = this.editingColumnDataTypeScale
} else if (dataType.type == '_fk_uuid_') {
dataType.reference = this.editingColumnDataTypeReference
} else if (dataType.type == '_other_') {
dataType.literal = this.editingColumnDataTypeLiteral
}
column.data_type = dataType
column.nullable = this.editingColumnNullable
column.description = this.editingColumnDescription
column.versioned = this.editingColumnVersioned
column.relationship = this.editingColumnRelationship
this.editingColumnShowDialog = false
}
@ -724,6 +845,10 @@
this.modelImportStatus = "import not yet attempted"
this.modelImportProblem = false
for (let column of this.tableColumns) {
column.formatted_data_type = this.formatDataType(column.data_type)
}
let url = '${url('{}.write_model_file'.format(route_prefix))}'
let params = {
branch_name: this.alembicBranch,