Skip to content
Snippets Groups Projects
Commit 63c4c4d2 authored by Lewis Liu's avatar Lewis Liu
Browse files

Added foreign key selector

parent 1b7f2364
Branches
Tags
No related merge requests found
......@@ -197,6 +197,8 @@ export const updateDatabase = createThunkAction(UPDATE_DATABASE, function(databa
const slimDatabase = _.omit(database, "tables", "tables_lookup");
const updatedDatabase = await MetabaseApi.db_update(slimDatabase);
await augmentDatabase(updatedDatabase);
const cleanDatabase = cleanResource(updatedDatabase);
const existingDatabase = existingDatabases[database.id];
......@@ -225,6 +227,8 @@ export const updateTable = createThunkAction(UPDATE_TABLE, function(table) {
const slimTable = _.omit(table, "fields", "fields_lookup", "aggregation_options", "breakout_options", "metrics", "segments");
const updatedTable = await MetabaseApi.table_update(slimTable);
await augmentTable(updatedTable);
const cleanTable = cleanResource(updatedTable);
const existingTable = existingTables[table.id];
......
......@@ -18,6 +18,7 @@ import pure from "recompose/pure";
const Field = ({
field,
foreignKeys,
specialTypeId,
url,
icon,
......@@ -101,7 +102,7 @@ const Field = ({
/> :
field.special_type === 'fk' &&
<span>
fk
{field.fk_target_field_id}
</span>
}
</div>
......
......@@ -19,6 +19,7 @@ import cx from "classnames";
import {
getSection,
getData,
getForeignKeys,
getError,
getLoading,
getUser,
......@@ -32,9 +33,11 @@ const fieldsToFormFields = (fields) => Object.keys(fields);
const mapStateToProps = (state, props) => {
const data = getData(state);
console.log(getForeignKeys(state));
return {
section: getSection(state),
entities: data,
foreignKeys: getForeignKeys(state),
loading: getLoading(state),
error: getError(state),
user: getUser(state),
......@@ -74,6 +77,7 @@ export default class ReferenceEntityList extends Component {
const {
entities,
fields,
foreignKeys,
style,
section,
error,
......@@ -160,6 +164,7 @@ export default class ReferenceEntityList extends Component {
<li className="relative" key={entity.id}>
<Field
field={entity}
foreignKeys={foreignKeys}
url={`${section.id}/${entity.id}`}
icon="star"
isEditing={isEditing}
......
......@@ -2,9 +2,7 @@ import { createSelector } from 'reselect';
import i from "icepick";
import Query, { AggregationClause } from 'metabase/lib/query';
//TODO: definitely lots of memoization opportunities here
// might not be very efficient until we use immutable data though
import { titleize, humanize } from "metabase/lib/formatting";
// there might be a better way to organize sections
// it feels like I'm duplicating a lot of routing logic here
......@@ -240,7 +238,7 @@ export const getMetric = createSelector(
);
export const getListId = (state) => Number.parseInt(state.router.params.listId);
const getLists = (state) => state.metadata.lists;
const getLists = (state) => {console.log(state); return state.metadata.lists;}
export const getList = createSelector(
[getListId, getLists],
(listId, lists) => lists[listId] || { id: listId }
......@@ -326,6 +324,43 @@ const getTableQuestions = createSelector(
.filter(question => question.table_id === table.id)
);
const getDatabaseByList = createSelector(
[getList, getTables, getDatabases],
(list, tables, databases) => list && list.table_id ?
databases[tables[list.table_id].db_id] : {}
);
const databaseToForeignKeys = (database) => database && database.tables_lookup &&
Object.values(database.tables_lookup)
.map(table => ({
table: table,
field: table && table.fields_lookup && Object.values(table.fields_lookup)
.find(field => field.special_type === 'id')
}))
.map(({ table, field }) => ({
id: field.id,
name: table.schema && table.schema !== "public" ?
`${titleize(humanize(table.schema))}.${table.display_name}${field.display_name}` :
`${table.display_name}${field.display_name}`,
description: field.description
}));
const getForeignKeysByList = createSelector(
[getDatabaseByList],
databaseToForeignKeys
);
const getForeignKeysByDatabase = createSelector(
[getDatabase],
databaseToForeignKeys
);
export const getForeignKeys = createSelector(
[getListId, getForeignKeysByList, getForeignKeysByDatabase],
(listId, foreignKeysByList, foreignKeysByDatabase) => listId ?
foreignKeysByList : foreignKeysByDatabase
)
export const getSections = createSelector(
[getSectionId, getMetric, getList, getDatabase, getTable, getField, getFieldByList, getUser, getReferenceSections],
(sectionId, metric, list, database, table, field, fieldByList, user, referenceSections) => {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment