diff --git a/.eslintrc.yml b/.eslintrc.yml index b7a6b8990e..09d5dc145a 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -8,7 +8,9 @@ '@typescript-eslint/lines-between-class-members': - error - exceptAfterSingleLine: true + '@typescript-eslint/naming-convention': off # TODO: reenable '@typescript-eslint/no-unused-vars': off # TODO: reenable + '@typescript-eslint/no-unused-expressions': off # TODO: reenable '@typescript-eslint/no-use-before-define': - error - variables: true @@ -20,6 +22,7 @@ class-methods-use-this: - off default-case: off + function-paren-newline: off # TODO: really tripping up. REENABLE guard-for-in: off # TODO: reenable import/no-cycle: off # TODO: reenable. disabled because circular deps are hard to fix right now import/prefer-default-export: off # named exports much better for .d.ts files @@ -49,6 +52,8 @@ multiline: true operator-linebreak: off # prevents JSX if statements looking correct. REVISIT for other uses prefer-const: off # TODO: revisit + prefer-destructuring: off # is too aggressive, sometimes doesn't make sense + prefer-template: off react/destructuring-assignment: off react/jsx-props-no-spreading: off # more acceptable in preact, b/c no proptype filtering react/react-in-jsx-scope: off # because we use preact diff --git a/packages/common/src/CalendarContent.tsx b/packages/common/src/CalendarContent.tsx index 3cba89d935..be387e06b5 100644 --- a/packages/common/src/CalendarContent.tsx +++ b/packages/common/src/CalendarContent.tsx @@ -24,7 +24,7 @@ import { EventClicking } from './interactions/EventClicking' import { EventHovering } from './interactions/EventHovering' import { getNow } from './reducers/current-date' import { CalendarInteraction } from './calendar-utils' -import { DelayedRunner } from './util/runner' +import { DelayedRunner } from './util/DelayedRunner' import { PureComponent } from './vdom-util' export interface CalendarContentProps extends CalendarData { diff --git a/packages/common/src/common/render-hook.tsx b/packages/common/src/common/render-hook.tsx index 6c6112c500..4bff07f107 100644 --- a/packages/common/src/common/render-hook.tsx +++ b/packages/common/src/common/render-hook.tsx @@ -218,7 +218,7 @@ export function buildClassNameNormalizer() { // TODO: general deep-me let currentHookProps: HookProps let currentClassNames: string[] = [] - return function (generator: ClassNamesGenerator, hookProps: HookProps) { + return (generator: ClassNamesGenerator, hookProps: HookProps) => { if (!currentHookProps || !isPropsEqual(currentHookProps, hookProps) || generator !== currentGenerator) { currentGenerator = generator currentHookProps = hookProps diff --git a/packages/common/src/component/event-splitting.ts b/packages/common/src/component/event-splitting.ts index 91c2b2a651..f2c4ed0c67 100644 --- a/packages/common/src/component/event-splitting.ts +++ b/packages/common/src/component/event-splitting.ts @@ -139,7 +139,7 @@ export abstract class Splitter { if (!splitStates[key]) { splitStates[key] = { affectedEvents: affectedStores[key] || EMPTY_EVENT_STORE, diff --git a/packages/common/src/datelib/DateFormatter.ts b/packages/common/src/datelib/DateFormatter.ts index aa21dde685..14599fea2b 100644 --- a/packages/common/src/datelib/DateFormatter.ts +++ b/packages/common/src/datelib/DateFormatter.ts @@ -12,7 +12,12 @@ export interface VerboseFormattingArg { // TODO: kill this defaultSeparator: string } -export function createVerboseFormattingArg(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext, betterDefaultSeparator?: string): VerboseFormattingArg { +export function createVerboseFormattingArg( + start: ZonedMarker, + end: ZonedMarker, + context: DateFormattingContext, + betterDefaultSeparator?: string, +): VerboseFormattingArg { let startInfo = expandZonedMarker(start, context.calendarSystem) let endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null diff --git a/packages/common/src/datelib/formatting-native.ts b/packages/common/src/datelib/formatting-native.ts index 7ec2a15984..de55b04c69 100644 --- a/packages/common/src/datelib/formatting-native.ts +++ b/packages/common/src/datelib/formatting-native.ts @@ -181,7 +181,7 @@ function buildNativeFormattingFunc( zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps) } - return function (date: ZonedMarker) { + return (date: ZonedMarker) => { let { marker } = date let format diff --git a/packages/common/src/interactions/interaction.ts b/packages/common/src/interactions/interaction.ts index 5341ad3479..b1a16adf5f 100644 --- a/packages/common/src/interactions/interaction.ts +++ b/packages/common/src/interactions/interaction.ts @@ -42,4 +42,4 @@ export function interactionSettingsToStore(settings: InteractionSettings) { } // global state -export let interactionSettingsStore: InteractionSettingsStore = {} +export const interactionSettingsStore: InteractionSettingsStore = {} diff --git a/packages/common/src/main.ts b/packages/common/src/main.ts index 61ddd5e959..4c3f0ccfa0 100644 --- a/packages/common/src/main.ts +++ b/packages/common/src/main.ts @@ -218,9 +218,15 @@ export { requestJson } from './util/requestJson' export * from './vdom' export { BaseComponent, setRef } from './vdom-util' -export { DelayedRunner } from './util/runner' +export { DelayedRunner } from './util/DelayedRunner' -export { ScrollGridProps, ScrollGridSectionConfig, ColGroupConfig, ScrollGridImpl, ScrollGridChunkConfig } from './scrollgrid/ScrollGridImpl' +export { + ScrollGridProps, + ScrollGridSectionConfig, + ColGroupConfig, + ScrollGridImpl, + ScrollGridChunkConfig, +} from './scrollgrid/ScrollGridImpl' export { SimpleScrollGrid, SimpleScrollGridSection } from './scrollgrid/SimpleScrollGrid' export { CssDimValue, ScrollerLike, SectionConfig, ColProps, ChunkConfig, hasShrinkWidth, renderMicroColGroup, diff --git a/packages/common/src/options.ts b/packages/common/src/options.ts index 2d5bd5f3a9..2ee7d565b8 100644 --- a/packages/common/src/options.ts +++ b/packages/common/src/options.ts @@ -402,7 +402,13 @@ export function mergeRawOptions(optionSets: Dictionary[]) { return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS) } -export function refineProps>(input: Raw, refiners: Refiners): { refined: RefinedOptionsFromRefiners, extra: Dictionary } { +export function refineProps>( + input: Raw, + refiners: Refiners, +): { + refined: RefinedOptionsFromRefiners, + extra: Dictionary, +} { let refined = {} as any let extra = {} as any diff --git a/packages/common/src/plugin-system.ts b/packages/common/src/plugin-system.ts index b5f0201e1d..6a5f87feae 100644 --- a/packages/common/src/plugin-system.ts +++ b/packages/common/src/plugin-system.ts @@ -106,7 +106,7 @@ export function buildBuildPluginHooks() { // memoizes let currentGlobalDefs: PluginDef[] = [] let currentHooks: PluginHooks - return function (overrideDefs: PluginDef[], globalDefs: PluginDef[]) { + return (overrideDefs: PluginDef[], globalDefs: PluginDef[]) => { if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) { currentHooks = buildPluginHooks(overrideDefs, globalDefs) } diff --git a/packages/common/src/reducers/CalendarDataManager.ts b/packages/common/src/reducers/CalendarDataManager.ts index 76d8f5a8fa..a0684b44a5 100644 --- a/packages/common/src/reducers/CalendarDataManager.ts +++ b/packages/common/src/reducers/CalendarDataManager.ts @@ -40,7 +40,7 @@ import { globalPlugins } from '../global-plugins' import { createEmptyEventStore } from '../structs/event-store' import { CalendarContext } from '../CalendarContext' import { CalendarDataManagerState, CalendarOptionsData, CalendarCurrentViewData, CalendarData } from './data-types' -import { TaskRunner } from '../util/runner' +import { TaskRunner } from '../util/TaskRunner' import { buildTitle } from './title-formatting' export interface CalendarDataManagerProps { @@ -340,7 +340,11 @@ export class CalendarDataManager { } } - _computeOptionsData(optionOverrides: CalendarOptions, dynamicOptionOverrides: CalendarOptions, calendarApi: CalendarApi): CalendarOptionsData { + _computeOptionsData( + optionOverrides: CalendarOptions, + dynamicOptionOverrides: CalendarOptions, + calendarApi: CalendarApi, + ): CalendarOptionsData { // TODO: blacklist options that are handled by optionChangeHandlers let { @@ -411,7 +415,11 @@ export class CalendarDataManager { if (optionName !== 'plugins') { // because plugins is special-cased if ( raw[optionName] === currentRaw[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && (optionName in currentRaw) && COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName])) + ( + COMPLEX_OPTION_COMPARATORS[optionName] && + (optionName in currentRaw) && + COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]) + ) ) { refined[optionName] = currentRefined[optionName] } else if (refiners[optionName]) { @@ -438,7 +446,12 @@ export class CalendarDataManager { } } - _computeCurrentViewData(viewType: string, optionsData: CalendarOptionsData, optionOverrides: CalendarOptions, dynamicOptionOverrides: CalendarOptions): CalendarCurrentViewData { + _computeCurrentViewData( + viewType: string, + optionsData: CalendarOptionsData, + optionOverrides: CalendarOptions, + dynamicOptionOverrides: CalendarOptions, + ): CalendarCurrentViewData { let viewSpec = optionsData.viewSpecs[viewType] if (!viewSpec) { @@ -482,7 +495,13 @@ export class CalendarDataManager { return { viewSpec, options: refinedOptions, dateProfileGenerator, viewApi } } - processRawViewOptions(viewSpec: ViewSpec, pluginHooks: PluginHooks, localeDefaults: CalendarOptions, optionOverrides: CalendarOptions, dynamicOptionOverrides: CalendarOptions) { + processRawViewOptions( + viewSpec: ViewSpec, + pluginHooks: PluginHooks, + localeDefaults: CalendarOptions, + optionOverrides: CalendarOptions, + dynamicOptionOverrides: CalendarOptions, + ) { let raw = mergeRawOptions([ BASE_OPTION_DEFAULTS, viewSpec.optionDefaults, @@ -599,40 +618,43 @@ function buildViewUiProps(calendarContext: CalendarContext) { let { options } = calendarContext return { - eventUiSingleBase: createEventUi({ - display: options.eventDisplay, - editable: options.editable, // without "event" at start - startEditable: options.eventStartEditable, - durationEditable: options.eventDurationEditable, - constraint: options.eventConstraint, - overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined, - allow: options.eventAllow, - backgroundColor: options.eventBackgroundColor, - borderColor: options.eventBorderColor, - textColor: options.eventTextColor, - color: options.eventColor - // classNames: options.eventClassNames // render hook will handle this - }, calendarContext), - - selectionConfig: createEventUi({ - constraint: options.selectConstraint, - overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined, - allow: options.selectAllow - }, calendarContext) + eventUiSingleBase: createEventUi( + { + display: options.eventDisplay, + editable: options.editable, // without "event" at start + startEditable: options.eventStartEditable, + durationEditable: options.eventDurationEditable, + constraint: options.eventConstraint, + overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined, + allow: options.eventAllow, + backgroundColor: options.eventBackgroundColor, + borderColor: options.eventBorderColor, + textColor: options.eventTextColor, + color: options.eventColor, + // classNames: options.eventClassNames // render hook will handle this + }, + calendarContext, + ), + selectionConfig: createEventUi( + { + constraint: options.selectConstraint, + overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined, + allow: options.selectAllow, + }, + calendarContext, + ), } } - function parseContextBusinessHours(calendarContext: CalendarContext) { return parseBusinessHours(calendarContext.options.businessHours, calendarContext) } - function warnUnknownOptions(options: any, viewName?: string) { for (let optionName in options) { console.warn( `Unknown option '${optionName}'` + - (viewName ? ` for view '${viewName}'` : '') + (viewName ? ` for view '${viewName}'` : ''), ) } } diff --git a/packages/common/src/reducers/eventStore.ts b/packages/common/src/reducers/eventStore.ts index 42c8572867..90a91725a0 100644 --- a/packages/common/src/reducers/eventStore.ts +++ b/packages/common/src/reducers/eventStore.ts @@ -18,7 +18,13 @@ import { DateEnv } from '../datelib/env' import { CalendarContext } from '../CalendarContext' import { expandRecurring } from '../structs/recurring-event' -export function reduceEventStore(eventStore: EventStore, action: Action, eventSources: EventSourceHash, dateProfile: DateProfile, context: CalendarContext): EventStore { +export function reduceEventStore( + eventStore: EventStore, + action: Action, + eventSources: EventSourceHash, + dateProfile: DateProfile, + context: CalendarContext, +): EventStore { switch (action.type) { case 'RECEIVE_EVENTS': // raw return receiveRawEvents( @@ -57,9 +63,9 @@ export function reduceEventStore(eventStore: EventStore, action: Action, eventSo return excludeEventsBySourceId(eventStore, action.sourceId) case 'REMOVE_ALL_EVENT_SOURCES': - return filterEventStoreDefs(eventStore, function(eventDef: EventDef) { - return !eventDef.sourceId // only keep events with no source id - }) + return filterEventStoreDefs(eventStore, (eventDef: EventDef) => ( + !eventDef.sourceId // only keep events with no source id + )) case 'REMOVE_ALL_EVENTS': return createEmptyEventStore() diff --git a/packages/common/src/reducers/view-type.ts b/packages/common/src/reducers/view-type.ts index 3477a4ab52..03ffd0da18 100644 --- a/packages/common/src/reducers/view-type.ts +++ b/packages/common/src/reducers/view-type.ts @@ -3,7 +3,7 @@ import { Action } from './Action' export function reduceViewType(viewType: string, action: Action): string { switch (action.type) { case 'CHANGE_VIEW_TYPE': - return viewType = action.viewType + viewType = action.viewType } return viewType diff --git a/packages/common/src/scrollgrid/SimpleScrollGrid.tsx b/packages/common/src/scrollgrid/SimpleScrollGrid.tsx index 58f7d46cc9..8c58ed7d0a 100644 --- a/packages/common/src/scrollgrid/SimpleScrollGrid.tsx +++ b/packages/common/src/scrollgrid/SimpleScrollGrid.tsx @@ -33,7 +33,10 @@ interface SimpleScrollGridState { export class SimpleScrollGrid extends BaseComponent { processCols = memoize((a) => a, isColPropsEqual) // so we get same `cols` props every time - renderMicroColGroup: typeof renderMicroColGroup = memoize(renderMicroColGroup) // yucky to memoize VNodes, but much more efficient for consumers + + // yucky to memoize VNodes, but much more efficient for consumers + renderMicroColGroup: typeof renderMicroColGroup = memoize(renderMicroColGroup) + scrollerRefs = new RefMap() scrollerElRefs = new RefMap(this._handleScrollerEl.bind(this)) diff --git a/packages/common/src/structs/event-parse.ts b/packages/common/src/structs/event-parse.ts index aad01d349a..de8b9963be 100644 --- a/packages/common/src/structs/event-parse.ts +++ b/packages/common/src/structs/event-parse.ts @@ -71,7 +71,14 @@ export function parseEvent( ) if (recurringRes) { - let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context) + let def = parseEventDef( + refined, + extra, + eventSource ? eventSource.sourceId : '', + recurringRes.allDay, + Boolean(recurringRes.duration), + context, + ) def.recurringDef = { // don't want all the props from recurringRes. TODO: more efficient way to do this typeId: recurringRes.typeId, @@ -105,7 +112,14 @@ export function buildEventRefiners(context: CalendarContext) { Will NOT populate extendedProps with the leftover properties. Will NOT populate date-related props. */ -export function parseEventDef(refined: EventRefined, extra: Dictionary, sourceId: string, allDay: boolean, hasEnd: boolean, context: CalendarContext): EventDef { +export function parseEventDef( + refined: EventRefined, + extra: Dictionary, + sourceId: string, + allDay: boolean, + hasEnd: boolean, + context: CalendarContext, +): EventDef { let def: EventDef = { title: refined.title || '', groupId: refined.groupId || '', diff --git a/packages/common/src/structs/event-store.ts b/packages/common/src/structs/event-store.ts index c8e38e2152..24b6999e48 100644 --- a/packages/common/src/structs/event-store.ts +++ b/packages/common/src/structs/event-store.ts @@ -86,9 +86,9 @@ export function mergeEventStores(store0: EventStore, store1: EventStore): EventS export function filterEventStoreDefs(eventStore: EventStore, filterFunc: (eventDef: EventDef) => boolean): EventStore { let defs = filterHash(eventStore.defs, filterFunc) - let instances = filterHash(eventStore.instances, function(instance: EventInstance) { - return defs[instance.defId] // still exists? - }) + let instances = filterHash(eventStore.instances, (instance: EventInstance) => ( + defs[instance.defId] // still exists? + )) return { defs, instances } } diff --git a/packages/common/src/structs/view-config.tsx b/packages/common/src/structs/view-config.tsx index 3e3fea0242..5b65840f00 100644 --- a/packages/common/src/structs/view-config.tsx +++ b/packages/common/src/structs/view-config.tsx @@ -56,37 +56,34 @@ export interface SpecificViewContentArg extends ViewProps { export type SpecificViewMountArg = MountArg function createViewHookComponent(options: ViewOptions) { - return function (viewProps: ViewProps) { - return ( - - {(context: ViewContext) => ( - - {(rootElRef, viewClassNames) => { - let hookProps: SpecificViewContentArg = { - ...viewProps, - nextDayThreshold: context.options.nextDayThreshold, - } - - return ( - - {(rootElRef, customClassNames, innerElRef, innerContent) => ( -
- {innerContent} -
- )} -
- ) - }} -
- )} -
- ) - } + return (viewProps: ViewProps) => ( + + {(context: ViewContext) => ( + + {(viewElRef, viewClassNames) => { + let hookProps: SpecificViewContentArg = { + ...viewProps, + nextDayThreshold: context.options.nextDayThreshold, + } + return ( + + {(rootElRef, customClassNames, innerElRef, innerContent) => ( +
+ {innerContent} +
+ )} +
+ ) + }} +
+ )} +
+ ) } diff --git a/packages/common/src/structs/view-def.ts b/packages/common/src/structs/view-def.ts index b790e7c627..0eb4a40be3 100644 --- a/packages/common/src/structs/view-def.ts +++ b/packages/common/src/structs/view-def.ts @@ -29,7 +29,12 @@ export function compileViewDefs(defaultConfigs: ViewConfigHash, overrideConfigs: return hash } -function ensureViewDef(viewType: string, hash: ViewDefHash, defaultConfigs: ViewConfigHash, overrideConfigs: ViewConfigHash): ViewDef | null { +function ensureViewDef( + viewType: string, + hash: ViewDefHash, + defaultConfigs: ViewConfigHash, + overrideConfigs: ViewConfigHash, +): ViewDef | null { if (hash[viewType]) { return hash[viewType] } @@ -43,14 +48,19 @@ function ensureViewDef(viewType: string, hash: ViewDefHash, defaultConfigs: View return viewDef } -function buildViewDef(viewType: string, hash: ViewDefHash, defaultConfigs: ViewConfigHash, overrideConfigs: ViewConfigHash): ViewDef | null { +function buildViewDef( + viewType: string, + hash: ViewDefHash, + defaultConfigs: ViewConfigHash, + overrideConfigs: ViewConfigHash, +): ViewDef | null { let defaultConfig = defaultConfigs[viewType] let overrideConfig = overrideConfigs[viewType] - let queryProp = function (name) { - return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] : + let queryProp = (name) => ( + (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] : ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null) - } + ) let theComponent = queryProp('component') as ViewComponentType let superType = queryProp('superType') as string diff --git a/packages/common/src/structs/view-spec.ts b/packages/common/src/structs/view-spec.ts index 551d05fee6..fc4e14f0c6 100644 --- a/packages/common/src/structs/view-spec.ts +++ b/packages/common/src/structs/view-spec.ts @@ -26,7 +26,12 @@ export interface ViewSpec { export type ViewSpecHash = { [viewType: string]: ViewSpec } -export function buildViewSpecs(defaultInputs: ViewConfigInputHash, optionOverrides: CalendarOptions, dynamicOptionOverrides: CalendarOptions, localeDefaults): ViewSpecHash { +export function buildViewSpecs( + defaultInputs: ViewConfigInputHash, + optionOverrides: CalendarOptions, + dynamicOptionOverrides: CalendarOptions, + localeDefaults, +): ViewSpecHash { let defaultConfigs = parseViewConfigs(defaultInputs) let overrideConfigs = parseViewConfigs(optionOverrides.views) let viewDefs = compileViewDefs(defaultConfigs, overrideConfigs) @@ -34,7 +39,13 @@ export function buildViewSpecs(defaultInputs: ViewConfigInputHash, optionOverrid return mapHash(viewDefs, (viewDef) => buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults)) } -function buildViewSpec(viewDef: ViewDef, overrideConfigs: ViewConfigHash, optionOverrides: CalendarOptions, dynamicOptionOverrides: CalendarOptions, localeDefaults): ViewSpec { +function buildViewSpec( + viewDef: ViewDef, + overrideConfigs: ViewConfigHash, + optionOverrides: CalendarOptions, + dynamicOptionOverrides: CalendarOptions, + localeDefaults, +): ViewSpec { let durationInput = viewDef.overrides.duration || viewDef.defaults.duration || @@ -60,7 +71,7 @@ function buildViewSpec(viewDef: ViewDef, overrideConfigs: ViewConfigHash, option } } - let queryButtonText = function (optionsSubset) { + let queryButtonText = (optionsSubset) => { let buttonTextMap = optionsSubset.buttonText || {} let buttonTextKey = viewDef.defaults.buttonTextKey as string @@ -75,6 +86,8 @@ function buildViewSpec(viewDef: ViewDef, overrideConfigs: ViewConfigHash, option if (buttonTextMap[singleUnit] != null) { return buttonTextMap[singleUnit] } + + return null } return { diff --git a/packages/common/src/toolbar-parse.ts b/packages/common/src/toolbar-parse.ts index 5791c8ad0b..dad3565166 100644 --- a/packages/common/src/toolbar-parse.ts +++ b/packages/common/src/toolbar-parse.ts @@ -13,8 +13,24 @@ export function parseToolbars( calendarApi: CalendarApi, ) { let viewsWithButtons: string[] = [] - let headerToolbar = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) : null - let footerToolbar = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) : null + let headerToolbar = calendarOptions.headerToolbar ? parseToolbar( + calendarOptions.headerToolbar, + calendarOptions, + calendarOptionOverrides, + theme, + viewSpecs, + calendarApi, + viewsWithButtons, + ) : null + let footerToolbar = calendarOptions.footerToolbar ? parseToolbar( + calendarOptions.footerToolbar, + calendarOptions, + calendarOptionOverrides, + theme, + viewSpecs, + calendarApi, + viewsWithButtons, + ) : null return { headerToolbar, footerToolbar, viewsWithButtons } } @@ -66,7 +82,7 @@ function parseSection( let buttonText // " if ((customButtonProps = calendarCustomButtons[buttonName])) { - buttonClick = function (ev: UIEvent) { + buttonClick = (ev: UIEvent) => { if (customButtonProps.click) { customButtonProps.click.call(ev.target, ev, ev.target) } @@ -77,14 +93,14 @@ function parseSection( } else if ((viewSpec = viewSpecs[buttonName])) { viewsWithButtons.push(buttonName) - buttonClick = function () { + buttonClick = () => { calendarApi.changeView(buttonName) }; (buttonText = viewSpec.buttonTextOverride) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = viewSpec.buttonTextDefault) } else if (calendarApi[buttonName]) { // a calendarApi method - buttonClick = function () { + buttonClick = () => { calendarApi[buttonName]() }; (buttonText = calendarButtonTextOverrides[buttonName]) || diff --git a/packages/common/src/util/runner.ts b/packages/common/src/util/DelayedRunner.ts similarity index 55% rename from packages/common/src/util/runner.ts rename to packages/common/src/util/DelayedRunner.ts index d6328b4c5f..a12a236ef8 100644 --- a/packages/common/src/util/runner.ts +++ b/packages/common/src/util/DelayedRunner.ts @@ -41,7 +41,8 @@ export class DelayedRunner { if (force) { delete pauseDepths[scope] } else { - let depth = --pauseDepths[scope] + pauseDepths[scope] -= 1 + let depth = pauseDepths[scope] if (depth <= 0) { delete pauseDepths[scope] @@ -88,57 +89,3 @@ export class DelayedRunner { } } } - -export class TaskRunner { // this class USES the DelayedRunner - private queue: Task[] = [] - - private delayedRunner: DelayedRunner // will most likely be used WITHOUT any delay - - constructor( - private runTaskOption?: (task: Task) => void, - private drainedOption?: (completedTasks: Task[]) => void, - ) { - this.delayedRunner = new DelayedRunner(this.drain.bind(this)) - } - - request(task: Task, delay?: number) { - this.queue.push(task) - this.delayedRunner.request(delay) - } - - pause(scope?: string) { - this.delayedRunner.pause(scope) - } - - resume(scope?: string, force?: boolean) { - this.delayedRunner.resume(scope, force) - } - - drain() { - let { queue } = this - - while (queue.length) { - let completedTasks: Task[] = [] - let task: Task - - while ((task = queue.shift())) { - this.runTask(task) - completedTasks.push(task) - } - - this.drained(completedTasks) - } // keep going, in case new tasks were added in the drained handler - } - - protected runTask(task: Task) { // subclasses can implement - if (this.runTaskOption) { - this.runTaskOption(task) - } - } - - protected drained(completedTasks: Task[]) { // subclasses can implement - if (this.drainedOption) { - this.drainedOption(completedTasks) - } - } -} diff --git a/packages/common/src/util/RefMap.ts b/packages/common/src/util/RefMap.ts index 139fd5e9ec..46e4ecc91a 100644 --- a/packages/common/src/util/RefMap.ts +++ b/packages/common/src/util/RefMap.ts @@ -30,14 +30,20 @@ export class RefMap { let added = false if (val !== null) { - removed = (key in currentMap) // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore + // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore + removed = (key in currentMap) + currentMap[key] = val depths[key] = (depths[key] || 0) + 1 added = true - } else if (--depths[key] === 0) { - delete currentMap[key] - delete this.callbackMap[key] - removed = true + } else { + depths[key] -= 1 + + if (!depths[key]) { + delete currentMap[key] + delete this.callbackMap[key] + removed = true + } } if (this.masterCallback) { diff --git a/packages/common/src/util/TaskRunner.ts b/packages/common/src/util/TaskRunner.ts new file mode 100644 index 0000000000..007ba1cfc5 --- /dev/null +++ b/packages/common/src/util/TaskRunner.ts @@ -0,0 +1,55 @@ +import { DelayedRunner } from './DelayedRunner' + +export class TaskRunner { // this class USES the DelayedRunner + private queue: Task[] = [] + + private delayedRunner: DelayedRunner // will most likely be used WITHOUT any delay + + constructor( + private runTaskOption?: (task: Task) => void, + private drainedOption?: (completedTasks: Task[]) => void, + ) { + this.delayedRunner = new DelayedRunner(this.drain.bind(this)) + } + + request(task: Task, delay?: number) { + this.queue.push(task) + this.delayedRunner.request(delay) + } + + pause(scope?: string) { + this.delayedRunner.pause(scope) + } + + resume(scope?: string, force?: boolean) { + this.delayedRunner.resume(scope, force) + } + + drain() { + let { queue } = this + + while (queue.length) { + let completedTasks: Task[] = [] + let task: Task + + while ((task = queue.shift())) { + this.runTask(task) + completedTasks.push(task) + } + + this.drained(completedTasks) + } // keep going, in case new tasks were added in the drained handler + } + + protected runTask(task: Task) { // subclasses can implement + if (this.runTaskOption) { + this.runTaskOption(task) + } + } + + protected drained(completedTasks: Task[]) { // subclasses can implement + if (this.drainedOption) { + this.drainedOption(completedTasks) + } + } +} diff --git a/packages/common/src/util/dom-event.ts b/packages/common/src/util/dom-event.ts index 50fdf68775..859439a343 100644 --- a/packages/common/src/util/dom-event.ts +++ b/packages/common/src/util/dom-event.ts @@ -13,7 +13,7 @@ export function buildDelegationHandler( selector: string, handler: (ev: EventType, matchedTarget: HTMLElement) => void, ) { - return function (ev: EventType) { + return (ev: EventType) => { let matchedChild = elementClosest(ev.target as HTMLElement, selector) if (matchedChild) { @@ -32,7 +32,7 @@ export function listenBySelector( container.addEventListener(eventType, attachedHandler) - return function () { + return () => { container.removeEventListener(eventType, attachedHandler) } } @@ -45,14 +45,14 @@ export function listenToHoverBySelector( ) { let currentMatchedChild - return listenBySelector(container, 'mouseover', selector, (ev, matchedChild) => { + return listenBySelector(container, 'mouseover', selector, (mouseOverEv, matchedChild) => { if (matchedChild !== currentMatchedChild) { currentMatchedChild = matchedChild - onMouseEnter(ev, matchedChild) + onMouseEnter(mouseOverEv, matchedChild) - let realOnMouseLeave = (ev) => { + let realOnMouseLeave = (mouseLeaveEv) => { currentMatchedChild = null - onMouseLeave(ev, matchedChild) + onMouseLeave(mouseLeaveEv, matchedChild) matchedChild.removeEventListener('mouseleave', realOnMouseLeave) } @@ -75,7 +75,7 @@ const transitionEventNames = [ // triggered only when the next single subsequent transition finishes export function whenTransitionDone(el: HTMLElement, callback: (ev: Event) => void) { - let realCallback = function (ev) { + let realCallback = (ev) => { callback(ev) transitionEventNames.forEach((eventName) => { el.removeEventListener(eventName, realCallback) diff --git a/packages/common/src/util/memoize.ts b/packages/common/src/util/memoize.ts index 4aacae3dfa..f3c92ff824 100644 --- a/packages/common/src/util/memoize.ts +++ b/packages/common/src/util/memoize.ts @@ -10,7 +10,7 @@ export function memoize( let currentArgs: Args | undefined let currentRes: Res | undefined - return function (...newArgs: Args) { + return function (...newArgs: Args) { // eslint-disable-line func-names if (!currentArgs) { currentRes = workerFunc.apply(this, newArgs) } else if (!isArraysEqual(currentArgs, newArgs)) { @@ -39,7 +39,7 @@ export function memoizeObjArg( let currentArg: Arg | undefined let currentRes: Res | undefined - return function (newArg: Arg) { + return (newArg: Arg) => { if (!currentArg) { currentRes = workerFunc.call(this, newArg) } else if (!isPropsEqual(currentArg, newArg)) { @@ -68,7 +68,7 @@ export function memoizeArraylike( // used at all? let currentArgSets: Args[] = [] let currentResults: Res[] = [] - return function (newArgSets: Args[]) { + return (newArgSets: Args[]) => { let currentLen = currentArgSets.length let newLen = newArgSets.length let i = 0 @@ -110,7 +110,7 @@ export function memoizeHashlike( // used? let currentArgHash: { [key: string]: Args } = {} let currentResHash: { [key: string]: Res } = {} - return function (newArgHash: { [key: string]: Args }) { + return (newArgHash: { [key: string]: Args }) => { let newResHash: { [key: string]: Res } = {} for (let key in newArgHash) { diff --git a/packages/common/src/util/misc.ts b/packages/common/src/util/misc.ts index 193c6e7327..b77a160cd5 100644 --- a/packages/common/src/util/misc.ts +++ b/packages/common/src/util/misc.ts @@ -5,7 +5,8 @@ export type GenericHash = { [key: string]: any } // already did this somewhere let guidNumber = 0 export function guid() { - return String(guidNumber += 1) + guidNumber += 1 + return String(guidNumber) } /* FullCalendar-specific DOM Utilities @@ -155,6 +156,7 @@ export function firstDefined(...args) { return args[i] } } + return undefined } /* FC-specific DOM dimension stuff diff --git a/packages/common/src/util/promise.ts b/packages/common/src/util/promise.ts index 10c88312b3..c998117718 100644 --- a/packages/common/src/util/promise.ts +++ b/packages/common/src/util/promise.ts @@ -6,17 +6,17 @@ export function unpromisify(func, success, failure?) { // guard against success/failure callbacks being called more than once // and guard against a promise AND callback being used together. let isResolved = false - let wrappedSuccess = function () { + let wrappedSuccess = function () { // eslint-disable-line func-names if (!isResolved) { isResolved = true - success.apply(this, arguments) + success.apply(this, arguments) // eslint-disable-line prefer-rest-params } } - let wrappedFailure = function () { + let wrappedFailure = function () { // eslint-disable-line func-names if (!isResolved) { isResolved = true if (failure) { - failure.apply(this, arguments) + failure.apply(this, arguments) // eslint-disable-line prefer-rest-params } } } diff --git a/packages/common/src/util/requestJson.ts b/packages/common/src/util/requestJson.ts index d7ad975a15..cecf18ce84 100644 --- a/packages/common/src/util/requestJson.ts +++ b/packages/common/src/util/requestJson.ts @@ -18,7 +18,7 @@ export function requestJson(method: string, url: string, params: Dictionary, suc xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') } - xhr.onload = function () { + xhr.onload = () => { if (xhr.status >= 200 && xhr.status < 400) { let parsed = false let res @@ -40,7 +40,7 @@ export function requestJson(method: string, url: string, params: Dictionary, suc } } - xhr.onerror = function () { + xhr.onerror = () => { failureCallback('Request failed', xhr) } diff --git a/packages/common/src/validation.ts b/packages/common/src/validation.ts index 427944e380..2d1d2c33d5 100644 --- a/packages/common/src/validation.ts +++ b/packages/common/src/validation.ts @@ -73,7 +73,9 @@ function isInteractionPropsValid(state: SplittableProps, context: CalendarContex subjectConfigs = mapHash(subjectConfigs, filterConfig) } - let otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances) // exclude the subject events. TODO: exclude defs too? + // exclude the subject events. TODO: exclude defs too? + let otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances) + let otherDefs = otherEventStore.defs let otherInstances = otherEventStore.instances let otherConfigs = compileEventUis(otherDefs, state.eventUiBases) diff --git a/packages/common/src/vdom-util.tsx b/packages/common/src/vdom-util.tsx index 508fb674be..f6a2aa714b 100644 --- a/packages/common/src/vdom-util.tsx +++ b/packages/common/src/vdom-util.tsx @@ -1,3 +1,5 @@ +/* eslint max-classes-per-file: off */ + import { __assign } from 'tslib' import { Component, Ref } from './vdom' import { ViewContextType, ViewContext } from './ViewContext' @@ -17,6 +19,7 @@ export abstract class PureComponent extends shouldComponentUpdate(nextProps: Props, nextState: State) { if (this.debug) { + // eslint-disable-next-line no-console console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state)) }