Skip to content

Commit 572662a

Browse files
lorem--ipsumvogievetsky
authored andcommitted
Added smart-ish attribute removal
1 parent c09f200 commit 572662a

File tree

4 files changed

+101
-8
lines changed

4 files changed

+101
-8
lines changed

src/client/views/settings-view/clusters/clusters.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,23 @@ export class Clusters extends React.Component<ClustersProps, ClustersState> {
7878
Notifier.removeQuestion();
7979
};
8080

81+
var message: string | JSX.Element;
8182

82-
Notifier.ask({
83-
title: `Remove the cluster "${cluster.title}"?`,
84-
message: <div className="message">
83+
if (dependantDataCubes.length > 0) {
84+
message = <div className="message">
8585
<p>This cluster has {dependantDataCubes.length} data cubes relying on it.</p>
8686
<p>Removing it will remove those cubes as well.</p>
8787
<div className="dependency-list">
8888
{dependantDataCubes.map(d => <p key={d.name}>{d.title}</p>)}
8989
</div>
90-
</div>,
90+
</div>;
91+
} else {
92+
message = 'This cannot be undone';
93+
}
94+
95+
Notifier.ask({
96+
title: `Remove the cluster "${cluster.title}"?`,
97+
message,
9198
choices: [
9299
{label: 'Remove', callback: remove, type: 'warn'},
93100
{label: 'Cancel', callback: Notifier.removeQuestion, type: 'secondary'}

src/client/views/settings-view/data-table/data-table.tsx

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ export class DataTable extends React.Component<DataTableProps, DataTableState> {
152152
};
153153

154154
const onRemove = () => {
155-
onChange(dataCube.removeAttribute(editedAttribute));
156155
onClose();
156+
this.askToRemoveAttribute(editedAttribute);
157157
};
158158

159159
return <AttributeModal
@@ -164,6 +164,53 @@ export class DataTable extends React.Component<DataTableProps, DataTableState> {
164164
/>;
165165
}
166166

167+
askToRemoveAttribute(attribute: AttributeInfo) {
168+
var { dataCube, onChange } = this.props;
169+
170+
const dependantDimensions = dataCube.dimensions.filter(d => {
171+
// TODO: insert here something that links a dimension and an attribute
172+
return (d.expression as any).name === attribute.name;
173+
});
174+
175+
const dependantMeasures = dataCube.measures.filter(m => {
176+
// TODO: insert here something that links a measure and an attribute
177+
return false;
178+
});
179+
180+
const remove = () => {
181+
dependantDimensions.forEach(d => dataCube = dataCube.removeDimension(d));
182+
dependantMeasures.forEach(m => dataCube = dataCube.removeMeasure(m));
183+
184+
onChange(dataCube.removeAttribute(attribute));
185+
Notifier.removeQuestion();
186+
};
187+
188+
var message: string | JSX.Element;
189+
190+
if (dependantDimensions.size > 0 || dependantMeasures.size > 0) {
191+
message = <div className="message">
192+
<p>This attribute has {dependantDimensions.size} dimensions and {dependantMeasures.size} measures relying on it.</p>
193+
<p>Removing it will remove them as well.</p>
194+
<div className="dependency-list">
195+
{dependantDimensions.map(d => <p key={d.name}>{d.title}</p>)}
196+
{dependantMeasures.map(m => <p key={m.name}>{m.title}</p>)}
197+
</div>
198+
</div>;
199+
} else {
200+
message = 'This cannot be undone';
201+
}
202+
203+
Notifier.ask({
204+
title: `Remove the attribute "${attribute.name}"?`,
205+
message,
206+
choices: [
207+
{label: 'Remove', callback: remove, type: 'warn'},
208+
{label: 'Cancel', callback: Notifier.removeQuestion, type: 'secondary'}
209+
],
210+
onClose: Notifier.removeQuestion
211+
});
212+
}
213+
167214
getColumns(): SimpleTableColumn[] {
168215
const dataCube = this.props.dataCube as DataCube;
169216
const primaryTimeAttribute = dataCube.getPrimaryTimeAttribute();

src/client/views/settings-view/settings-view.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ export interface SettingsViewState {
6464
const PATHS = {
6565
general: 'general',
6666
clusters: 'clusters',
67-
dataCubes: 'data-cubes'
67+
dataCubes: 'data-cubes',
68+
newDataCube: 'new-data-cube'
6869
};
6970

7071
const VIEWS = [
@@ -252,13 +253,25 @@ export class SettingsView extends React.Component<SettingsViewProps, SettingsVie
252253
// !-- DataCubes creation flow
253254

254255

256+
shouldHaveLeftButtons(): boolean {
257+
const { breadCrumbs } = this.state;
258+
259+
if (!breadCrumbs) return true;
260+
261+
if (breadCrumbs.length === 1) return true;
262+
263+
if (breadCrumbs[0] === PATHS.dataCubes && breadCrumbs[1] !== PATHS.newDataCube) return false;
264+
265+
return true;
266+
}
267+
255268
render() {
256269
const { user, onNavClick, customization } = this.props;
257270
const { settings, breadCrumbs, tempCluster, tempClusterSources, tempDataCube } = this.state;
258271

259272
if (!settings) return null;
260273

261-
const hasLeftButtons = breadCrumbs && (breadCrumbs.length === 1 || breadCrumbs.indexOf(PATHS.dataCubes) === -1);
274+
const hasLeftButtons = this.shouldHaveLeftButtons();
262275

263276
const inflateCluster = (key: string, value: string): {key: string, value: any} => {
264277
if (key !== 'clusterId') return {key, value};
@@ -335,7 +348,7 @@ export class SettingsView extends React.Component<SettingsViewProps, SettingsVie
335348
<Route fragment={PATHS.dataCubes}>
336349
<DataCubes settings={settings} onSave={this.onSave.bind(this)}/>
337350

338-
<Route fragment="new-data-cube">
351+
<Route fragment={PATHS.newDataCube}>
339352
{ tempDataCube ? null : <DataCubes settings={settings} onSave={this.onSave.bind(this)}/> }
340353

341354
{ tempDataCube

src/common/models/data-cube/data-cube.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,32 @@ export class DataCube implements Instance<DataCubeValue, DataCubeJS> {
798798
return new DataCube(value);
799799
}
800800

801+
public removeDimension(dimension: Dimension): DataCube {
802+
var index = this.dimensions.indexOf(dimension);
803+
804+
if (index === -1) {
805+
throw new Error(`Unknown dimension : ${dimension.toString()}`);
806+
}
807+
808+
var newDimensions = this.dimensions.toArray().concat();
809+
newDimensions.splice(index, 1);
810+
811+
return this.changeDimensions(List(newDimensions));
812+
}
813+
814+
public removeMeasure(measure: Measure): DataCube {
815+
var index = this.measures.indexOf(measure);
816+
817+
if (index === -1) {
818+
throw new Error(`Unknown measure : ${measure.toString()}`);
819+
}
820+
821+
var newMeasures = this.measures.toArray().concat();
822+
newMeasures.splice(index, 1);
823+
824+
return this.changeMeasures(List(newMeasures));
825+
}
826+
801827
public filterDimensions(dimensionsToFilter: Dimension[]): Dimension[] {
802828
return dimensionsToFilter.filter(dimension => {
803829
if (this.getDimension(dimension.name)) return false;

0 commit comments

Comments
 (0)