Skip to content
Snippets Groups Projects
Commit 932351ae authored by Tom Robinson's avatar Tom Robinson
Browse files

Initial implemenentation of global and field level formatting settings

parent 53564a22
Branches
Tags
No related merge requests found
......@@ -31,6 +31,9 @@ import {
FieldVisibilityPicker,
SpecialTypeAndTargetPicker,
} from "metabase/admin/datamodel/components/database/ColumnItem";
import ColumnSettings from "metabase/visualizations/components/ColumnSettings";
import { getDatabaseIdfields } from "metabase/admin/datamodel/selectors";
import Metadata from "metabase-lib/lib/metadata/Metadata";
import Question from "metabase-lib/lib/Question";
......@@ -152,6 +155,10 @@ export default class FieldApp extends Component {
this.props.deleteFieldDimension,
);
onUpdateFieldSettings = settings => {
return this.onUpdateFieldProperties({ settings });
};
render() {
const {
metadata,
......@@ -263,6 +270,14 @@ export default class FieldApp extends Component {
}
/>
</Section>
<Section>
<ColumnSettings
value={(field && field.settings) || {}}
onChange={this.onUpdateFieldSettings}
column={field}
/>
</Section>
</div>
</div>
)}
......
import React from "react";
import { TYPE } from "metabase/lib/types";
import ColumnSettings from "metabase/visualizations/components/ColumnSettings";
const SETTING_TYPES = [
{
name: "Date and Time",
type: TYPE.DateTime,
settings: ["date_style", "date_abbreviate", "time_style"],
column: {
special_type: TYPE.DateTime,
unit: "second",
},
},
{
name: "Number",
type: TYPE.Number,
settings: ["locale"],
column: {
base_type: TYPE.Number,
special_type: TYPE.Number,
},
},
{
name: "Currency",
type: TYPE.Currency,
settings: ["currency_style", "currency"],
column: {
base_type: TYPE.Number,
special_type: TYPE.Currency,
},
},
];
class FormattingWidget extends React.Component {
render() {
const { setting, onChange } = this.props;
const value = setting.value || setting.default;
return (
<div className="flex mt2">
{SETTING_TYPES.map(({ type, name, column, settings }) => (
<div className="border-column-divider pr4 mr4">
<h3 className="mb2">{name}</h3>
<ColumnSettings
value={value[type]}
onChange={settings => onChange({ ...value, [type]: settings })}
column={column}
settings={settings}
/>
</div>
))}
</div>
);
}
}
export default FormattingWidget;
......@@ -13,6 +13,7 @@ import SecretKeyWidget from "./components/widgets/SecretKeyWidget.jsx";
import EmbeddingLegalese from "./components/widgets/EmbeddingLegalese";
import EmbeddingLevel from "./components/widgets/EmbeddingLevel";
import LdapGroupMappingsWidget from "./components/widgets/LdapGroupMappingsWidget";
import FormattingWidget from "./components/widgets/FormattingWidget";
import { UtilApi } from "metabase/services";
......@@ -309,6 +310,18 @@ const SECTIONS = [
},
],
},
{
name: t`Formatting`,
slug: "formatting",
settings: [
{
display_name: t`Formatting Options`,
description: "",
key: "custom-formatting",
widget: FormattingWidget,
},
],
},
{
name: t`Public Sharing`,
slug: "public_sharing",
......
import React from "react";
import { getSettingDefintionsForColumn } from "metabase/visualizations/lib/settings/column";
import {
getSettingsWidgets,
getComputedSettings,
} from "metabase/visualizations/lib/settings";
import ChartSettingsWidget from "metabase/visualizations/components/ChartSettingsWidget";
const ColumnSettings = ({ value, onChange, column, settings = null }) => {
const settingsSet = settings && new Set(settings);
const storedSettings = value || {};
// fake series
const series = [{ card: {}, data: { rows: [], cols: [] } }];
const settingsDefs = getSettingDefintionsForColumn(series, column);
const computedSettings = getComputedSettings(
settingsDefs,
column,
storedSettings,
{ series },
);
const widgets = getSettingsWidgets(
settingsDefs,
computedSettings,
column,
changedSettings => {
onChange({ ...storedSettings, ...changedSettings });
},
{ series },
);
return (
<div>
{widgets
.filter(widget => !settingsSet || settingsSet.has(widget.id))
.map(widget => (
<ChartSettingsWidget
key={widget.id}
{...widget}
hidden={false}
noPadding
/>
))}
</div>
);
};
export default ColumnSettings;
......@@ -68,8 +68,24 @@ export function columnSettings({
});
}
import MetabaseSettings from "metabase/lib/settings";
import { isa } from "metabase/lib/types";
function getInhertiedSettingsForColumn(column) {
return column.settings || {};
let inheritedSettings = {};
const customFormatting = MetabaseSettings.get("custom-formatting");
for (const [type, globalSettings] of Object.entries(customFormatting || {})) {
if (isa(column.special_type, type)) {
Object.assign(inheritedSettings, globalSettings);
}
}
if (column.settings) {
Object.assign(inheritedSettings, column.settings);
}
return inheritedSettings;
}
const EXAMPLE_DATE = moment("2018-01-07 17:24");
......
......@@ -126,6 +126,11 @@
:type :double
:default 10.0)
(defsetting custom-formatting
(tru "Object keyed by type, containing formatting settings")
:type :json
:default {})
(defn remove-public-uuid-if-public-sharing-is-disabled
"If public sharing is *disabled* and OBJECT has a `:public_uuid`, remove it so people don't try to use it (since it
won't work). Intended for use as part of a `post-select` implementation for Cards and Dashboards."
......@@ -154,6 +159,7 @@
{:admin_email (admin-email)
:anon_tracking_enabled (anon-tracking-enabled)
:custom_geojson (setting/get :custom-geojson)
:custom_formatting (setting/get :custom-formatting)
:email_configured ((resolve 'metabase.email/email-configured?))
:embedding (enable-embedding)
:enable_query_caching (enable-query-caching)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment