Skip to content

Commit

Permalink
feat: add event updater plugin (#349)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomosterlund committed Apr 15, 2024
1 parent 981dc3c commit 0e81005
Show file tree
Hide file tree
Showing 31 changed files with 360 additions and 61 deletions.
5 changes: 4 additions & 1 deletion development/calendar/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { createEventRecurrencePlugin } from '@schedule-x/event-recurrence/src'
import { createCalendarControlsPlugin } from '../../packages/calendar-controls/src'
import { CalendarAppSingleton } from '@schedule-x/shared/src'
import { createCurrentTimePlugin } from '../../packages/current-time/src/current-time-plugin.impl.ts'
import { createEventUpdaterPlugin } from '../../packages/event-updater/src'

const calendarElement = document.getElementById('calendar') as HTMLElement

Expand Down Expand Up @@ -64,6 +65,7 @@ const calendarsUpdaterPlugin = new CalendarsUpdaterPlugin()


const calendarControlsPlugin = createCalendarControlsPlugin()
const eventUpdaterPlugin = createEventUpdaterPlugin()
const calendar = createCalendar({
// weekOptions: {
// gridHeight: 3000,
Expand Down Expand Up @@ -165,6 +167,7 @@ const calendar = createCalendar({
plugins: [
createDragAndDropPlugin(),
createEventModalPlugin(),
eventUpdaterPlugin,
scrollControllerPlugin,
createResizePlugin(),
createEventRecurrencePlugin(),
Expand Down Expand Up @@ -239,7 +242,7 @@ themeToggle.addEventListener('click', () => {

const addEventButton = document.getElementById('add-event') as HTMLButtonElement
addEventButton.addEventListener('click', () => {
calendar.events.add({
eventUpdaterPlugin.add({
id: 'new-event',
title: 'New Event',
start: '2023-12-18',
Expand Down
2 changes: 1 addition & 1 deletion libs/assertions/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@
"lint:fix": "eslint -c eslintrc.cjs . --ext .ts --fix . --ext .tsx --fix",
"format": "prettier . --write"
},
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion libs/e2e-testing/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@
"lint:fix": "eslint -c eslintrc.cjs . --ext .ts --fix . --ext .tsx --fix",
"format": "prettier . --write"
},
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion libs/eslint-config/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"publishConfig": {
"access": "public"
},
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion libs/prettier-config/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@
"peerDependencies": {
"prettier": "^3.0.0"
},
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion packages/calendar-controls/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@
"directory": "packages/calendar-controls"
},
"homepage": "https://schedule-x.dev",
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion packages/calendar/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,5 @@
"directory": "packages/calendar"
},
"homepage": "https://schedule-x.dev",
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion packages/current-time/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,5 @@
"directory": "packages/current-time"
},
"homepage": "https://schedule-x.dev",
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion packages/date-picker/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@
"directory": "packages/date-picker"
},
"homepage": "https://schedule-x.dev",
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion packages/drag-and-drop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@
"directory": "packages/drag-and-drop"
},
"homepage": "https://schedule-x.dev",
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion packages/event-modal/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@
"directory": "packages/event-modal"
},
"homepage": "https://schedule-x.dev",
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
2 changes: 1 addition & 1 deletion packages/event-recurrence/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@
"directory": "packages/event-recurrence"
},
"homepage": "https://schedule-x.dev",
"gitHead": "bc6158f71b92cb6a7deab101a8824de29129cff5"
"gitHead": "981dc3c7e4f5d56288dfbb27b992ea73e8206675"
}
73 changes: 32 additions & 41 deletions packages/event-recurrence/src/__test__/events-facade.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,31 @@ import {
it,
expect,
} from '@schedule-x/shared/src/utils/stateless/testing/unit/unit-testing-library.impl'
import { createEventRecurrencePlugin } from '../event-recurrence-plugin.impl'
import { createEventUpdaterPlugin } from '../event-updater-plugin.impl'
import { __createAppWithViews__ } from '@schedule-x/calendar/src/utils/stateless/testing/__create-app-with-views__'

describe('Events facade for recurrence plugin', () => {
describe('Adding events', () => {
it('should add one event without an rrule', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event = {
id: '1',
start: '2021-01-01',
end: '2021-01-01',
}
eventsFacade.add(event)
plugin.add(event)

expect($app.calendarEvents.list.value.length).toBe(1)
})

it('should add one event with an rrule', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event = {
Expand All @@ -39,7 +37,7 @@ describe('Events facade for recurrence plugin', () => {
end: '2021-01-01',
rrule: 'FREQ=WEEKLY;COUNT=3',
}
eventsFacade.add(event)
plugin.add(event)

expect($app.calendarEvents.list.value.length).toBe(3)
})
Expand All @@ -48,9 +46,8 @@ describe('Events facade for recurrence plugin', () => {
describe('Getting a single event by id', () => {
it('should return the event if it exists', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event = {
Expand All @@ -59,28 +56,26 @@ describe('Events facade for recurrence plugin', () => {
end: '2021-01-01',
rrule: 'FREQ=WEEKLY;COUNT=3',
}
eventsFacade.add(event)
plugin.add(event)

expect(eventsFacade.get('1')).toEqual(event)
expect(plugin.get('1')).toEqual(event)
})

it('should return undefined if the event does not exist', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

expect(eventsFacade.get('1')).toBeUndefined()
expect(plugin.get('1')).toBeUndefined()
})
})

describe('Getting all events', () => {
it('should return all events', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event1 = {
Expand All @@ -89,16 +84,16 @@ describe('Events facade for recurrence plugin', () => {
end: '2021-01-01',
rrule: 'FREQ=WEEKLY;COUNT=3',
}
eventsFacade.add(event1)
plugin.add(event1)
const event2 = {
id: '2',
start: '2021-01-01',
end: '2021-01-01',
}
eventsFacade.add(event2)
plugin.add(event2)

expect(eventsFacade.getAll()).toHaveLength(2)
expect(eventsFacade.getAll()).toEqual(
expect(plugin.getAll()).toHaveLength(2)
expect(plugin.getAll()).toEqual(
expect.arrayContaining([
event1,
{ id: '2', start: '2021-01-01', end: '2021-01-01' },
Expand All @@ -110,28 +105,26 @@ describe('Events facade for recurrence plugin', () => {
describe('Removing events', () => {
it('should remove one event without an rrule', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event = {
id: '1',
start: '2021-01-01',
end: '2021-01-01',
}
eventsFacade.add(event)
plugin.add(event)
expect($app.calendarEvents.list.value.length).toBe(1)

eventsFacade.remove('1')
plugin.remove('1')
expect($app.calendarEvents.list.value.length).toBe(0)
})

it('should remove one event with an rrule', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event = {
Expand All @@ -140,20 +133,19 @@ describe('Events facade for recurrence plugin', () => {
end: '2021-01-01',
rrule: 'FREQ=WEEKLY;COUNT=3',
}
eventsFacade.add(event)
plugin.add(event)
expect($app.calendarEvents.list.value.length).toBe(3)

eventsFacade.remove('1')
plugin.remove('1')
expect($app.calendarEvents.list.value.length).toBe(0)
})
})

describe('Updating events', () => {
it('should update an event with rrule', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event = {
Expand All @@ -162,20 +154,19 @@ describe('Events facade for recurrence plugin', () => {
end: '2021-01-01',
rrule: 'FREQ=WEEKLY;COUNT=3',
}
eventsFacade.add(event)
plugin.add(event)
expect($app.calendarEvents.list.value.length).toBe(3)

eventsFacade.update({ id: '1', start: '2021-01-01', end: '2021-01-01' })
plugin.update({ id: '1', start: '2021-01-01', end: '2021-01-01' })
expect($app.calendarEvents.list.value.length).toBe(1)
})
})

describe('Setting the whole list of events', () => {
it('should set the whole list of events', () => {
const $app = __createAppWithViews__()
const plugin = createEventRecurrencePlugin()
const plugin = createEventUpdaterPlugin()
plugin.init!($app)
const eventsFacade = plugin.eventsFacade
expect($app.calendarEvents.list.value.length).toBe(0)

const event1 = {
Expand All @@ -184,25 +175,25 @@ describe('Events facade for recurrence plugin', () => {
end: '2021-01-01',
rrule: 'FREQ=WEEKLY;COUNT=3',
}
eventsFacade.add(event1)
plugin.add(event1)
const event2 = {
id: '2',
start: '2021-01-01',
end: '2021-01-01',
}
eventsFacade.add(event2)
plugin.add(event2)

expect(eventsFacade.getAll()).toHaveLength(2)
expect(eventsFacade.getAll()).toEqual(
expect(plugin.getAll()).toHaveLength(2)
expect(plugin.getAll()).toEqual(
expect.arrayContaining([
event1,
{ id: '2', start: '2021-01-01', end: '2021-01-01' },
])
)

eventsFacade.set([{ id: '3', start: '2021-01-01', end: '2021-01-01' }])
expect(eventsFacade.getAll()).toHaveLength(1)
expect(eventsFacade.getAll()).toEqual(
plugin.set([{ id: '3', start: '2021-01-01', end: '2021-01-01' }])
expect(plugin.getAll()).toHaveLength(1)
expect(plugin.getAll()).toEqual(
expect.arrayContaining([
{ id: '3', start: '2021-01-01', end: '2021-01-01' },
])
Expand Down
43 changes: 43 additions & 0 deletions packages/event-recurrence/src/event-updater-plugin.impl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import PluginBase from '@schedule-x/shared/src/interfaces/plugin.interface'
import { CalendarAppSingleton } from '@schedule-x/shared/src'
import EventsFacade from '@schedule-x/shared/src/utils/stateful/events-facade/events-facade.interface'
import { EventsFacadeImpl } from './util/stateful/events-facade'
import CalendarEventExternal from '@schedule-x/shared/src/interfaces/calendar/calendar-event.interface'

class EventUpdaterPluginImpl implements PluginBase {
name: string = 'EventUpdaterPlugin'
$app!: CalendarAppSingleton
eventsFacade!: EventsFacade

init($app: CalendarAppSingleton): void {
this.$app = $app
this.eventsFacade = new EventsFacadeImpl(this.$app)
}

add(event: CalendarEventExternal): void {
this.eventsFacade.add(event)
}

update(event: CalendarEventExternal): void {
this.eventsFacade.update(event)
}

remove(eventId: string): void {
this.eventsFacade.remove(eventId)
}

get(eventId: string): CalendarEventExternal | undefined {
return this.eventsFacade.get(eventId)
}

getAll(): CalendarEventExternal[] {
return this.eventsFacade.getAll()
}

set(events: CalendarEventExternal[]): void {
this.eventsFacade.set(events)
}
}

export const createEventUpdaterPlugin = (): EventUpdaterPluginImpl =>
new EventUpdaterPluginImpl()
1 change: 1 addition & 0 deletions packages/event-recurrence/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export { createEventRecurrencePlugin } from './event-recurrence-plugin.impl'
export { createEventUpdaterPlugin } from './event-updater-plugin.impl'
1 change: 1 addition & 0 deletions packages/event-updater/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"@schedule-x/prettier-config"
5 changes: 5 additions & 0 deletions packages/event-updater/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
![Schedule-X](https://schedule-x.s3.eu-west-1.amazonaws.com/schedule-x-logo.png)

# @schedule-x/event-updater

https://schedule-x.dev
3 changes: 3 additions & 0 deletions packages/event-updater/eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
extends: ['@schedule-x/eslint-config'],
}

0 comments on commit 0e81005

Please sign in to comment.