mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-01-22 09:32:41 +00:00
fix: timetable dates cannot be removed
This commit is contained in:
committed by
Rainer Killinger
parent
29585faff6
commit
9242438132
25
src/app/_helpers/collections/difference.spec.ts
Normal file
25
src/app/_helpers/collections/difference.spec.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 StApps
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {differenceBy} from './difference';
|
||||||
|
|
||||||
|
describe('differenceBy', function () {
|
||||||
|
it('should return the difference of two arrays', function () {
|
||||||
|
const a = [1, 2, 3, 4, 5];
|
||||||
|
const b = [1, 2, 3];
|
||||||
|
|
||||||
|
expect(differenceBy(a, b, it => it)).toEqual([4, 5]);
|
||||||
|
});
|
||||||
|
});
|
||||||
27
src/app/_helpers/collections/difference.ts
Normal file
27
src/app/_helpers/collections/difference.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 StApps
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the difference between two arrays.
|
||||||
|
*/
|
||||||
|
export function differenceBy<T>(
|
||||||
|
a: T[],
|
||||||
|
b: T[],
|
||||||
|
transform: (item: T) => unknown,
|
||||||
|
) {
|
||||||
|
const disallowed = new Set(b.map(transform));
|
||||||
|
|
||||||
|
return a.filter(item => !disallowed.has(transform(item)));
|
||||||
|
}
|
||||||
@@ -21,7 +21,7 @@ export function groupBy<T>(
|
|||||||
group: (item: T) => string | undefined,
|
group: (item: T) => string | undefined,
|
||||||
): Record<string, T[]> {
|
): Record<string, T[]> {
|
||||||
return collection.reduce((accumulator: Record<string, T[]>, item) => {
|
return collection.reduce((accumulator: Record<string, T[]>, item) => {
|
||||||
const key = group(item) || '';
|
const key = group(item) ?? '';
|
||||||
accumulator[key] = accumulator[key] ?? [];
|
accumulator[key] = accumulator[key] ?? [];
|
||||||
accumulator[key].push(item);
|
accumulator[key].push(item);
|
||||||
return accumulator;
|
return accumulator;
|
||||||
|
|||||||
26
src/app/_helpers/collections/uniq.spec.ts
Normal file
26
src/app/_helpers/collections/uniq.spec.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 StApps
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {uniqBy} from './uniq';
|
||||||
|
|
||||||
|
describe('uniq', function () {
|
||||||
|
it('should return an array with unique values', function () {
|
||||||
|
const array = [
|
||||||
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||||
|
];
|
||||||
|
const result = uniqBy(array, it => it);
|
||||||
|
expect(result).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
||||||
|
});
|
||||||
|
});
|
||||||
29
src/app/_helpers/collections/uniq.ts
Normal file
29
src/app/_helpers/collections/uniq.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 StApps
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter out duplicates from an array.
|
||||||
|
*/
|
||||||
|
export function uniqBy<T>(
|
||||||
|
array: T[],
|
||||||
|
transform: (item: T) => string | number,
|
||||||
|
): T[] {
|
||||||
|
return Object.values(
|
||||||
|
array.reduce((accumulator, current) => {
|
||||||
|
accumulator[transform(current)] = current;
|
||||||
|
return accumulator;
|
||||||
|
}, {} as Record<string | number, T>),
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -35,6 +35,8 @@ import {ThingTranslatePipe} from '../../../translation/thing-translate.pipe';
|
|||||||
import {groupBy, groupByProperty} from '../../../_helpers/collections/group-by';
|
import {groupBy, groupByProperty} from '../../../_helpers/collections/group-by';
|
||||||
import {mapValues} from '../../../_helpers/collections/map-values';
|
import {mapValues} from '../../../_helpers/collections/map-values';
|
||||||
import {stringSortBy} from '../../../_helpers/collections/string-sort';
|
import {stringSortBy} from '../../../_helpers/collections/string-sort';
|
||||||
|
import {uniqBy} from '../../../_helpers/collections/uniq';
|
||||||
|
import {differenceBy} from '../../../_helpers/collections/difference';
|
||||||
|
|
||||||
enum Selection {
|
enum Selection {
|
||||||
ON = 2,
|
ON = 2,
|
||||||
@@ -267,13 +269,16 @@ export class AddEventPopoverComponent implements OnInit, OnDestroy {
|
|||||||
async onCommit(save: boolean) {
|
async onCommit(save: boolean) {
|
||||||
if (save) {
|
if (save) {
|
||||||
const {selected, unselected} = this.getSelection();
|
const {selected, unselected} = this.getSelection();
|
||||||
console.log(selected, unselected);
|
|
||||||
this.scheduleProvider.partialEvents$.next([
|
this.scheduleProvider.partialEvents$.next(
|
||||||
...new Set([
|
uniqBy(
|
||||||
...this.partialDateSeries.filter(it => !unselected.includes(it)),
|
[
|
||||||
|
...differenceBy(this.partialDateSeries, unselected, it => it.uid),
|
||||||
...selected,
|
...selected,
|
||||||
]),
|
],
|
||||||
]);
|
it => it.uid,
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.popoverController.dismiss();
|
await this.popoverController.dismiss();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2021 StApps
|
* Copyright (C) 2022 StApps
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the Free
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
* Software Foundation, version 3.
|
* Software Foundation, version 3.
|
||||||
@@ -40,7 +40,10 @@ export class ScheduleDayComponent {
|
|||||||
dateSeriesGroups?: ScheduleEvent[][];
|
dateSeriesGroups?: ScheduleEvent[][];
|
||||||
|
|
||||||
@Input() set dateSeries(value: Record<string, ScheduleEvent>) {
|
@Input() set dateSeries(value: Record<string, ScheduleEvent>) {
|
||||||
if (!value) return;
|
if (!value) {
|
||||||
|
delete this.dateSeriesGroups;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.dateSeriesGroups = groupRangeOverlaps(
|
this.dateSeriesGroups = groupRangeOverlaps(
|
||||||
Object.values(value),
|
Object.values(value),
|
||||||
|
|||||||
Reference in New Issue
Block a user