Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

feat(jsonFilter): add optional arg to define custom indentation #9771

Closed
wants to merge 11 commits into from
3 changes: 2 additions & 1 deletion src/Angular.js
Original file line number Diff line number Diff line change
@@ -969,7 +969,8 @@ function toJsonReplacer(key, value) {
*/
function toJson(obj, pretty) {
if (typeof obj === 'undefined') return undefined;
return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null);
var spaces = pretty ? ((angular.isNumber(pretty) && pretty > 0) ? new Array(pretty + 1).join(' ') : ' ') : null;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this line isn't needed --- JSON.stringify will convert numbers into the right number of spaces on its own.

return JSON.stringify(obj, toJsonReplacer, spaces);
}


12 changes: 8 additions & 4 deletions src/ng/filter/filters.js
Original file line number Diff line number Diff line change
@@ -503,25 +503,29 @@ function dateFilter($locale) {
* the binding is automatically converted to JSON.
*
* @param {*} object Any JavaScript object (including arrays and primitive types) to filter.
* @param {number=} the number of spaces to use per indentation, defaults to 2.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a param name (i.e. spacing) before the description.
Also, if the above change is implemented (allowing anything as spacing) the type and description should be modified accordingly.

* @returns {string} JSON string.
*
*
* @example
<example>
<file name="index.html">
<pre>{{ {'name':'value'} | json }}</pre>
<pre id="default-spacing">{{ {'name':'value'} | json }}</pre>
<pre id="custom-spacing">{{ {'name':'value'} | json:4 }}</pre>
</file>
<file name="protractor.js" type="protractor">
it('should jsonify filtered objects', function() {
expect(element(by.binding("{'name':'value'}")).getText()).toMatch(/\{\n "name": ?"value"\n}/);
expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/);
expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/);
});
</file>
</example>
*
*/
function jsonFilter() {
return function(object) {
return toJson(object, true);
return function(object, spacing) {
if (isUndefined(spacing)) spacing = 2;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if (isUndefined(spacing)) {
  spacing = 2;
}

return toJson(object, spacing);
};
}

3 changes: 3 additions & 0 deletions test/ng/filter/filtersSpec.js
Original file line number Diff line number Diff line change
@@ -200,6 +200,9 @@ describe('filters', function() {
it('should do basic filter', function() {
expect(filter('json')({a:"b"})).toEqual(toJson({a:"b"}, true));
});
it('should allow custom indentation', function() {
expect(filter('json')({a:"b"}, 4)).toEqual(toJson({a:"b"}, 4));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't really like how we're using toJson to test the output from toJson -.-

});
});

describe('lowercase', function() {