ngrx-forms
Version:
Proper integration of forms in Angular 4 applications using ngrx
36 lines • 6.42 kB
JavaScript
import { SwapArrayControlAction } from '../../actions';
import { computeArrayState } from '../../state';
import { childReducer, updateIdRecursive } from './util';
function swapArrayValues(a, i, j) {
const n = [...a];
[n[i], n[j]] = [n[j], n[i]];
return n;
}
export function swapControlReducer(state, action) {
if (action.type !== SwapArrayControlAction.TYPE) {
return state;
}
if (action.controlId !== state.id) {
return childReducer(state, action);
}
const fromIndex = action.fromIndex;
const toIndex = action.toIndex;
if (fromIndex === toIndex) {
return state;
}
if (fromIndex < 0 || toIndex < 0) {
throw new Error(`fromIndex ${fromIndex} or toIndex ${fromIndex} was negative`);
}
if (fromIndex >= state.controls.length || toIndex >= state.controls.length) {
throw new Error(`fromIndex ${fromIndex} or toIndex ${toIndex} is out of bounds with the length of the controls ${state.controls.length}`);
}
let controls = swapArrayValues(state.controls, fromIndex, toIndex);
controls = controls.map((c, i) => (i >= fromIndex || i >= toIndex) ? updateIdRecursive(c, `${state.id}.${i}`) : c);
return computeArrayState(state.id, controls, state.value, state.errors, state.pendingValidations, state.userDefinedProperties, {
wasOrShouldBeDirty: true,
wasOrShouldBeEnabled: state.isEnabled,
wasOrShouldBeTouched: state.isTouched,
wasOrShouldBeSubmitted: state.isSubmitted,
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcC1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FycmF5L3JlZHVjZXIvc3dhcC1jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVyxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQWtCLE1BQU0sYUFBYSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFekQsU0FBUyxlQUFlLENBQUMsQ0FBaUIsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUM5RCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxLQUE2QixFQUM3QixNQUF5QjtJQUV6QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssc0JBQXNCLENBQUMsSUFBSSxFQUFFO1FBQy9DLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRTtRQUNqQyxPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDcEM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ25DLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFFL0IsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1FBQ3pCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsU0FBUyxlQUFlLFNBQVMsZUFBZSxDQUFDLENBQUM7S0FDaEY7SUFFRCxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDMUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLFNBQVMsZUFBZSxPQUFPLHFEQUFxRCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDM0k7SUFFRCxJQUFJLFFBQVEsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBTSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXhILE9BQU8saUJBQWlCLENBQ3RCLEtBQUssQ0FBQyxFQUFFLEVBQ1IsUUFBUSxFQUNSLEtBQUssQ0FBQyxLQUFLLEVBQ1gsS0FBSyxDQUFDLE1BQU0sRUFDWixLQUFLLENBQUMsa0JBQWtCLEVBQ3hCLEtBQUssQ0FBQyxxQkFBcUIsRUFDM0I7UUFDRSxrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQ3JDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQ3JDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxXQUFXO0tBQzFDLENBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25zLCBTd2FwQXJyYXlDb250cm9sQWN0aW9uIH0gZnJvbSAnLi4vLi4vYWN0aW9ucyc7XHJcbmltcG9ydCB7IGNvbXB1dGVBcnJheVN0YXRlLCBGb3JtQXJyYXlTdGF0ZSB9IGZyb20gJy4uLy4uL3N0YXRlJztcclxuaW1wb3J0IHsgY2hpbGRSZWR1Y2VyLCB1cGRhdGVJZFJlY3Vyc2l2ZSB9IGZyb20gJy4vdXRpbCc7XHJcblxyXG5mdW5jdGlvbiBzd2FwQXJyYXlWYWx1ZXMoYTogcmVhZG9ubHkgYW55W10sIGk6IG51bWJlciwgajogbnVtYmVyKSB7XHJcbiAgY29uc3QgbiA9IFsuLi5hXTtcclxuICBbbltpXSwgbltqXV0gPSBbbltqXSwgbltpXV07XHJcbiAgcmV0dXJuIG47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzd2FwQ29udHJvbFJlZHVjZXI8VFZhbHVlPihcclxuICBzdGF0ZTogRm9ybUFycmF5U3RhdGU8VFZhbHVlPixcclxuICBhY3Rpb246IEFjdGlvbnM8VFZhbHVlW10+LFxyXG4pOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+IHtcclxuICBpZiAoYWN0aW9uLnR5cGUgIT09IFN3YXBBcnJheUNvbnRyb2xBY3Rpb24uVFlQRSkge1xyXG4gICAgcmV0dXJuIHN0YXRlO1xyXG4gIH1cclxuXHJcbiAgaWYgKGFjdGlvbi5jb250cm9sSWQgIT09IHN0YXRlLmlkKSB7XHJcbiAgICByZXR1cm4gY2hpbGRSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZnJvbUluZGV4ID0gYWN0aW9uLmZyb21JbmRleDtcclxuICBjb25zdCB0b0luZGV4ID0gYWN0aW9uLnRvSW5kZXg7XHJcblxyXG4gIGlmIChmcm9tSW5kZXggPT09IHRvSW5kZXgpIHtcclxuICAgIHJldHVybiBzdGF0ZTtcclxuICB9XHJcblxyXG4gIGlmIChmcm9tSW5kZXggPCAwIHx8IHRvSW5kZXggPCAwKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZyb21JbmRleCAke2Zyb21JbmRleH0gb3IgdG9JbmRleCAke2Zyb21JbmRleH0gd2FzIG5lZ2F0aXZlYCk7XHJcbiAgfVxyXG5cclxuICBpZiAoZnJvbUluZGV4ID49IHN0YXRlLmNvbnRyb2xzLmxlbmd0aCB8fCB0b0luZGV4ID49IHN0YXRlLmNvbnRyb2xzLmxlbmd0aCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBmcm9tSW5kZXggJHtmcm9tSW5kZXh9IG9yIHRvSW5kZXggJHt0b0luZGV4fSBpcyBvdXQgb2YgYm91bmRzIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgY29udHJvbHMgJHtzdGF0ZS5jb250cm9scy5sZW5ndGh9YCk7XHJcbiAgfVxyXG5cclxuICBsZXQgY29udHJvbHMgPSBzd2FwQXJyYXlWYWx1ZXMoc3RhdGUuY29udHJvbHMsIGZyb21JbmRleCwgdG9JbmRleCk7XHJcbiAgY29udHJvbHMgPSBjb250cm9scy5tYXAoKGMsIGkpID0+IChpID49IGZyb21JbmRleCB8fCBpID49IHRvSW5kZXgpID8gdXBkYXRlSWRSZWN1cnNpdmU8YW55PihjLCBgJHtzdGF0ZS5pZH0uJHtpfWApIDogYyk7XHJcblxyXG4gIHJldHVybiBjb21wdXRlQXJyYXlTdGF0ZShcclxuICAgIHN0YXRlLmlkLFxyXG4gICAgY29udHJvbHMsXHJcbiAgICBzdGF0ZS52YWx1ZSxcclxuICAgIHN0YXRlLmVycm9ycyxcclxuICAgIHN0YXRlLnBlbmRpbmdWYWxpZGF0aW9ucyxcclxuICAgIHN0YXRlLnVzZXJEZWZpbmVkUHJvcGVydGllcyxcclxuICAgIHtcclxuICAgICAgd2FzT3JTaG91bGRCZURpcnR5OiB0cnVlLFxyXG4gICAgICB3YXNPclNob3VsZEJlRW5hYmxlZDogc3RhdGUuaXNFbmFibGVkLFxyXG4gICAgICB3YXNPclNob3VsZEJlVG91Y2hlZDogc3RhdGUuaXNUb3VjaGVkLFxyXG4gICAgICB3YXNPclNob3VsZEJlU3VibWl0dGVkOiBzdGF0ZS5pc1N1Ym1pdHRlZCxcclxuICAgIH1cclxuICApO1xyXG59XHJcbiJdfQ==