Skip to content

Commit

Permalink
refactor: resolve with result
Browse files Browse the repository at this point in the history
  • Loading branch information
veinfors committed Sep 22, 2019
1 parent 7ce1b7d commit 11a5bfb
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 22 deletions.
26 changes: 19 additions & 7 deletions src/__tests__/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ describe('measure modifiers', () => {
sandbox.restore();
});

it('should resolve immediately if it is snapshot mode, case 1', async () => {
it('should resolve immediately if it is a snapshot, case 1', async () => {
await Modifiers.apply({ model, isSnapshot: true });

expect(model.getEffectiveProperties).to.not.have.been.called;
Expand All @@ -106,9 +106,10 @@ describe('measure modifiers', () => {
describe('hasActiveModifiers', () => {
it('should resolve promise immediately if there are no modifiers', async () => {
delete model.layout.qHyperCube.qMeasureInfo[0].modifiers;
await Modifiers.apply({ model });
const modified = await Modifiers.apply({ model });

expect(model.getEffectiveProperties).to.not.have.been.called;
expect(modified, 'should resolve with false if no props were modified').to.be.false;
});

it('should resolve immediately if there are no supported modifiers', async () => {
Expand All @@ -122,9 +123,10 @@ describe('measure modifiers', () => {
it('should resolve immediately if there are no enabled modifiers', async () => {
model.layout.qHyperCube.qMeasureInfo[0].modifiers[0].disabled = true;

await Modifiers.apply({ model });
const modified = await Modifiers.apply({ model });

expect(model.getEffectiveProperties).to.not.have.been.called;
expect(modified, 'should resolve with false if no props were modified').to.be.false;
});

it('should resolve immediately if there are no applicable modifiers', async () => {
Expand Down Expand Up @@ -340,29 +342,38 @@ describe('measure modifiers', () => {

describe('updateProps (persistance)', () => {
it('should call softPropertyHandler.saveSoftProperties when there are no update privileges', async () => {
await Modifiers.apply({ model });
const modified = await Modifiers.apply({ model });

expect(SoftPropertyHandler.saveSoftProperties).to.have.been.calledOnce;
expect(modified, 'should resolve with true if props were modified and (temp) persisted').to.be.true;
});

it('should call model.setProperties when there are update privileges', async () => {
model.layout.qMeta = {
privileges: ['remove', 'update'],
};

await Modifiers.apply({ model });
const modified = await Modifiers.apply({ model });

expect(model.setProperties).to.have.been.calledOnce;
expect(modified, 'should resolve with true if props were modified and persisted').to.be.true;
});
});

describe('clean up', () => {
it('should remove base if no active modifiers', async () => {
model.layout.qHyperCube.qMeasureInfo[0].base = {
qDef: 'Sum(Sales)',
};
model.properties.qHyperCubeDef.qMeasures[0].qDef.base = {
qDef: 'Sum(Sales)',
};
delete model.layout.qHyperCube.qMeasureInfo[0].modifiers;

await Modifiers.apply({ model });
const modified = await Modifiers.apply({ model });

expect(model.properties.qHyperCubeDef.qMeasures[0].qDef.base).to.be.undefined;
expect(modified, 'should resolve with true if props were modified and persisted').to.be.true;
});

it('should reset to original qDef if no active modifiers', async () => {
Expand Down Expand Up @@ -411,9 +422,10 @@ describe('measure modifiers', () => {
color: 'bla bla',
};

await Modifiers.apply({ model });
const modified = await Modifiers.apply({ model });

expect(model.properties.qHyperCubeDef.qMeasures[0].qDef.coloring).to.be.undefined;
expect(modified, 'should resolve with true if props were modified and persisted').to.be.true;
});
});

Expand Down
33 changes: 21 additions & 12 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,13 @@ const objects = {};
* @param {Object} [options.properties] - object properties.
* @param {boolean} [options.isSnapshot=false] - is it a snapshot or not?
* @param {Object} [options.masterItem] - layout of master item
* @returns {Promise} Promise resolves when properties has been updated
* @returns {Promise} Promise resolving with a boolean - modified: true/false (true if a setProperties or applyPatches has run)
* @static
*/
function apply({
model, properties, isSnapshot = false, masterItem,
} = {}) {
const modified = false;
objects[model.id] = objects[model.id] || {
isFirstTime: true,
};
Expand All @@ -75,7 +76,7 @@ function apply({
const inSelections = util.getValue(layout, 'qSelectionInfo.qInSelections');

if (isSnapshot || inSelections) {
return Promise.resolve();
return Promise.resolve(modified);
}

const measures = util.getValue(layout, 'qHyperCube.qMeasureInfo');
Expand All @@ -101,14 +102,14 @@ function apply({
});
});
}
return Promise.resolve();
return Promise.resolve(modified);
}

if (hasSomethingToRemove(measures)) {
return model.getEffectiveProperties().then(props => cleanUpModifiers({ model, properties: props }));
}

return Promise.resolve();
return Promise.resolve(modified);
}

/**
Expand All @@ -120,7 +121,7 @@ function apply({
* @param {Object[]} [options.measures] - An array of measure properties
* @param {boolean} [options.runUpdateIfChange=false] - Wether of not properties should be persisted (soft patched when readonly access)
* @param {Object} [options.masterItem] - layout of master item
* @returns {Promise} Promise resolves when properties has been updated
* @returns {Promise} Promise resolving with a boolean - modified: true/false (true if a setProperties or applyPatches has run)
* @static
*/
function applyModifiers({
Expand All @@ -132,9 +133,9 @@ function applyModifiers({
const oldProperties = runUpdateIfChange ? extend(true, {}, properties) : properties; // Copy the current porperties and use the current properties to update values. This will work for 'set property' here or later through a change in property panel
return updateMeasuresProperties({ measures, properties, model }).then(() => {
if (runUpdateIfChange) {
return updateIfChanged({ oldProperties, newProperties: properties, model });
return updateIfChanged({ oldProperties, newProperties: properties, model }); // returns promise with modified: true/false
}
return Promise.resolve();
return Promise.resolve(false);
});
});
}
Expand Down Expand Up @@ -430,15 +431,19 @@ function updateTotalsFunction(measure) {
}
}

/**
* @returns {Promise} Promise resolving with a boolean - modified: true/false
* @private
*/
function updateIfChanged({ oldProperties, newProperties, model }) {
const hasChanged = JSON.stringify(util.getValue(oldProperties, 'qHyperCubeDef.qMeasures'))
const modified = JSON.stringify(util.getValue(oldProperties, 'qHyperCubeDef.qMeasures'))
!== JSON.stringify(util.getValue(newProperties, 'qHyperCubeDef.qMeasures'))
|| JSON.stringify(util.getValue(oldProperties, 'qHyperCubeDef.qLayoutExclude.qHyperCubeDef.qMeasures'))
!== JSON.stringify(util.getValue(newProperties, 'qHyperCubeDef.qLayoutExclude.qHyperCubeDef.qMeasures'));
if (!hasChanged) {
return Promise.resolve();
if (!modified) {
return Promise.resolve(modified);
}
return updateProperties({ model, oldProperties, newProperties });
return updateProperties({ model, oldProperties, newProperties }).then(() => modified);
}

function applyMeasureModifiers({ measure, properties, libraryItemsProps }) {
Expand Down Expand Up @@ -532,14 +537,18 @@ function updateMasterItemsSubscription({ model, libraryIds, masterItem }) {
return Promise.resolve();
}

/**
* @returns {Promise} Promise resolving with a boolean - modified: true/false
* @private
*/
function cleanUpModifiers({ model, properties }) {
const libraryIds = getLibraryIds(properties);
return updateMasterItemsSubscription({ model, libraryIds }).then(() => {
// restore original
const oldProperties = extend(true, {}, properties);
const measures = util.getValue(properties, 'qHyperCubeDef.qMeasures', []);
measures.forEach(measure => cleanUpMeasure(measure));
return updateIfChanged({ oldProperties, newProperties: properties, model });
return updateIfChanged({ oldProperties, newProperties: properties, model }); // returns promise with modified: true/false
});
}

Expand Down
6 changes: 3 additions & 3 deletions src/soft-property-handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import JSONPatch from './utils/json-patch';
const softPropertyHandler = {
saveSoftProperties(model, prevEffectiveProperties, effectiveProperties) {
if (!model) {
return Promise.resolve(false);
return Promise.resolve();
}

let patches = JSONPatch.generate(prevEffectiveProperties, effectiveProperties);
Expand All @@ -17,9 +17,9 @@ const softPropertyHandler = {
qPath: p.path,
}));

return model.applyPatches(patches, true).then(() => true);
return model.applyPatches(patches, true);
}
return Promise.resolve(false);
return Promise.resolve();
},
};

Expand Down

0 comments on commit 11a5bfb

Please sign in to comment.