@plasmicpkgs/plasmic-rich-components 1.0.170 → 1.0.172

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasmicpkgs/plasmic-rich-components",
3
- "version": "1.0.170",
3
+ "version": "1.0.172",
4
4
  "description": "Rich batteries-included general purpose components for business apps, admin panels, etc.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -44,8 +44,8 @@
44
44
  "devDependencies": {
45
45
  "@ant-design/icons": "^5.0.1",
46
46
  "@ant-design/pro-components": "2.6.4",
47
- "@plasmicapp/data-sources": "0.1.143",
48
- "@plasmicapp/host": "1.0.185",
47
+ "@plasmicapp/data-sources": "0.1.144",
48
+ "@plasmicapp/host": "1.0.186",
49
49
  "@rollup/plugin-commonjs": "^25.0.2",
50
50
  "@rollup/plugin-json": "^6.0.0",
51
51
  "@rollup/plugin-node-resolve": "^15.1.0",
@@ -82,5 +82,5 @@
82
82
  "fast-stringify": "^2.0.0",
83
83
  "lodash": "^4.17.21"
84
84
  },
85
- "gitHead": "8f013c9e895ee9aebc0224e43b45b82a30771e9f"
85
+ "gitHead": "c8e66753e8f375487f4dc60f29897496fe889e51"
86
86
  }
@@ -384,7 +384,8 @@ function registerRichCalendar(loader) {
384
384
  props: {
385
385
  data: {
386
386
  type: "dataSourceOpData",
387
- description: "The data to display. Should be a list of records with some date field."
387
+ displayName: "Events",
388
+ description: "The events data should be a list of records with some date field."
388
389
  },
389
390
  title: commonPropTypes.roleProp({ role: "title" }),
390
391
  date: commonPropTypes.roleProp({ role: "date", singular: true }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/rich-calendar/RichCalendar.tsx","../../src/rich-calendar/index.tsx"],"sourcesContent":["import {\n deriveFieldConfigs,\n NormalizedData,\n useNormalizedData,\n} from \"@plasmicapp/data-sources\";\nimport { parseDate } from \"@plasmicpkgs/luxon-parser\";\nimport { Badge, Calendar } from \"antd\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport groupBy from \"lodash/groupBy\";\nimport React, { useMemo } from \"react\";\nimport { BaseColumnConfig, FieldfulProps, RowFunc } from \"../field-mappings\";\nimport { getFieldAggregateValue } from \"../formatting\";\nimport {\n ensure,\n ensureArray,\n isLikeColor,\n isLikeDate,\n isValidIsoDate,\n maybe,\n mkShortId,\n} from \"../utils\";\n\nimport localeData from \"dayjs/plugin/localeData\";\nimport weekday from \"dayjs/plugin/weekday\";\n\ndayjs.extend(weekday);\ndayjs.extend(localeData);\n\ntype RichCalendarPropsBase = Omit<\n React.ComponentProps<typeof Calendar>,\n \"value\" | \"defaultValue\" | \"validRange\"\n>;\n\nexport interface RichCalendarProps\n extends FieldfulProps<EventsConfig>,\n RichCalendarPropsBase {\n color: EventsConfig[];\n date: EventsConfig[];\n title: EventsConfig[];\n value: string;\n defaultValue: string;\n validRange: [string | undefined, string | undefined] | undefined;\n}\n\ninterface Event {\n date: string;\n title: string;\n color?: string;\n}\n\nfunction getEventFullDate(date?: string): string | undefined {\n const parsed = parseDate(date);\n if (!parsed) return undefined;\n const yyyy = parsed.getFullYear();\n const mm = (parsed.getMonth() + 1).toString().padStart(2, \"0\");\n const dd = parsed.getDate().toString().padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd}`;\n}\n\nfunction getEventMonthYear(date?: string): string | undefined {\n return getEventFullDate(date)?.substring(0, 7);\n}\n\nfunction EventCell({ events }: { events: Event[] }) {\n if (!events || !events.length) return null;\n return (\n <ul style={{ all: \"unset\" }}>\n {events.map((e) => (\n <li key={JSON.stringify(e)} style={{ all: \"unset\", display: \"block\" }}>\n <Badge color={e.color || \"green\"} text={e.title} />\n </li>\n ))}\n </ul>\n );\n}\n\nexport function RichCalendar(props: RichCalendarProps) {\n const {\n data: rawData = {\n data: [],\n schema: {\n id: \"inferred\",\n fields: [\n {\n id: \"id\",\n type: \"string\",\n readOnly: false,\n },\n ],\n },\n },\n value: isoValue,\n defaultValue: isoDefaultValue,\n validRange: isoValidRange,\n dateCellRender,\n dateFullCellRender,\n monthCellRender,\n monthFullCellRender,\n ...rest\n } = props;\n const data = useNormalizedData(rawData);\n\n const { normalized, finalRoles: roleConfigs } = useRoleDefinitions(\n data,\n props\n );\n const {\n eventsByDate,\n eventsByMonth,\n }: {\n eventsByDate: Record<string, Event[]>;\n eventsByMonth: Record<string, Event[]>;\n } = useMemo(() => {\n if (!data) return { eventsByDate: {}, eventsByMonth: {} };\n return data?.data.reduce(\n (acc: any, item: any) => {\n const date = getFieldAggregateValue(item, roleConfigs.date);\n const title = getFieldAggregateValue(item, roleConfigs.title);\n const color = getFieldAggregateValue(item, roleConfigs.color);\n\n const event = {\n date,\n title,\n color,\n };\n\n const keyDate = getEventFullDate(date); // extract the date-only part\n const keyMonth = getEventMonthYear(date); // extract the month-year part\n if (keyDate && keyMonth) {\n acc.eventsByDate[keyDate] = [\n ...(acc.eventsByDate[keyDate] || []),\n event,\n ];\n acc.eventsByMonth[keyMonth] = [\n ...(acc.eventsByMonth[keyMonth] || []),\n event,\n ];\n }\n\n return acc;\n },\n { eventsByDate: {}, eventsByMonth: {} }\n );\n }, [data, roleConfigs.color, roleConfigs.date, roleConfigs.title]);\n\n const value = useMemo(\n () => (isValidIsoDate(isoValue) ? dayjs(isoValue) : dayjs()),\n [isoValue]\n ); // https://day.js.org/docs/en/parse/now`\n const defaultValue = useMemo(\n () => (isValidIsoDate(isoDefaultValue) ? dayjs(isoDefaultValue) : dayjs()),\n [isoDefaultValue]\n ); // https://day.js.org/docs/en/parse/now\n\n const validRange: [Dayjs, Dayjs] | undefined = useMemo(() => {\n if (!isoValidRange) return undefined;\n\n const range = isoValidRange\n .filter((dateIso: string | undefined) => isValidIsoDate(dateIso))\n .map((d: any) => dayjs(d));\n\n if (range.length !== 2) return undefined;\n return [range[0], range[1]];\n }, [isoValidRange]);\n\n const key = useMemo(() => JSON.stringify(roleConfigs), [roleConfigs]);\n\n return (\n <Calendar\n {...rest}\n key={key}\n validRange={validRange}\n // for interactive / preview mode\n defaultValue={defaultValue}\n // for design mode\n value={value}\n dateCellRender={\n dateCellRender\n ? dateCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByDate[getEventFullDate(date.toISOString())!]}\n />\n )\n }\n monthCellRender={\n monthCellRender\n ? monthCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByMonth[getEventMonthYear(date.toISOString())!]}\n />\n )\n }\n dateFullCellRender={dateFullCellRender}\n monthFullCellRender={monthFullCellRender}\n />\n );\n}\n\ninterface StyleConfig {\n styles: Record<string, any>;\n align: \"left\" | \"center\" | \"right\";\n freeze: \"off\" | \"left\" | \"right\";\n}\n\nconst defaultColumnConfig = (): EventsConfig =>\n ({\n key: mkShortId(),\n isEditableExpr: () => false,\n disableSorting: false,\n sortByExpr: undefined,\n isHidden: false,\n formatting: {\n styles: {},\n align: \"left\",\n freeze: \"off\",\n },\n dataType: \"auto\" as const,\n role: undefined,\n } as const);\n\nconst roles = [\"date\", \"title\", \"color\", \"unset\"] as const;\n\nexport type Role = (typeof roles)[number];\n\nexport type EventsConfig = BaseColumnConfig & {\n isEditableExpr: RowFunc<boolean>;\n disableSorting: boolean;\n sortByExpr?: RowFunc<any>;\n formatting: StyleConfig;\n\n /**\n * The default inferred role, not the actual user-set role.\n */\n role: undefined | Role | \"unset\";\n};\n\n// This component is different from Table/Details since it has various different roles, so the UX is one of setting the choices for each role rather than a single list of fields.\n//\n// We first infer the defaults for each role.\n// This we always need to do because we want the choices to be 'stable'.\n// If the user sets one of the roles, without setting the others, we don't want to shift things around on the other roles as a result.\n// So the defaults need to always be there (they would only be irrelevant if all roles that would have had defaults were set/overridden by the user).\n//\n// Then, we layer on the user role choices.\n//\n// One UX wart is that unsetting a role will restore the default selection instead of clearing it.\n// User must know to actually set fieldId to none or (for arrays) remove the item.\n// Just another reason to fill in few roles by default.\nfunction useRoleDefinitions(\n data: NormalizedData | undefined,\n props: React.ComponentProps<typeof RichCalendar>\n) {\n const { fields, setControlContextData } = props;\n\n return React.useMemo(() => {\n const schema = data?.schema;\n if (!data || !schema) {\n return { normalized: [], finalRoles: {} };\n }\n\n function tagFieldConfigs(role: Role) {\n if (role !== \"unset\") {\n return ensureArray(props[role] ?? []).map((field) => {\n return {\n ...field,\n role,\n };\n });\n } else {\n return [];\n }\n }\n\n // This is only being computed to get the default role choices.\n const specifiedFieldsPartial = [\n ...tagFieldConfigs(\"date\"),\n ...tagFieldConfigs(\"color\"),\n ...tagFieldConfigs(\"title\"),\n ];\n\n function doDeriveFieldConfigs(mode: \"existing\" | \"defaults\") {\n return deriveFieldConfigs<EventsConfig>(\n mode === \"defaults\" ? [] : specifiedFieldsPartial,\n schema,\n (field) => ({\n ...defaultColumnConfig(),\n ...(field && {\n key: field.id,\n fieldId: field.id,\n title: field.label || field.id,\n // undefined means not yet determined in this routine, not 'unset'\n role: undefined,\n expr: (currentItem) => currentItem[field.id],\n }),\n })\n );\n }\n\n // Now we derive the defaults.\n //\n // We always start from a blank slate for this. We want stability - we don't want a situation where we are constantly shifting around the defaults based on what else the user has set.\n //\n // For instance,\n // (1) we derive `city` to be content,\n // (2) user sets `city` as title,\n // (3) we now derive a different content because `city` is used.\n const {\n mergedFields: defaultMergedFields,\n minimalFullLengthFields: defaultMinimalFullLengthFields,\n } = doDeriveFieldConfigs(\"defaults\");\n\n // Find a good default date field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a date in ISO date-only or date-time format, or a timestamp\n // Of these, prefer the one with a name like date, timestamp.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"date\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const dateFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeDate(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const dateField =\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/^(date|datetime|timestamp|eventdate)$/i)\n ) ??\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(date|time|event).*/i)\n ) ??\n dateFieldCandidates[0];\n if (dateField) {\n dateField.role = \"date\";\n }\n }\n\n // Find a good default color field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a color code.\n // Of these, prefer the one with a name like color.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"color\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const colorFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeColor(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const colorField =\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/^(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb)$/i)\n ) ??\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb).*/i)\n ) ??\n colorFieldCandidates[0];\n if (colorField) {\n colorField.role = \"color\";\n }\n }\n\n // Find a good default title field, just based on the field name.\n if (!defaultMergedFields.some((field) => field.role === \"title\")) {\n const titleField = defaultMergedFields.find(\n (field) =>\n !field.role &&\n field.fieldId?.toLowerCase().match(/^(title|name||event[ _-]?name)$/)\n );\n if (titleField) {\n titleField.role = \"title\";\n }\n }\n\n const fieldIdToDefaultRole = new Map(\n defaultMergedFields.map((f) => [f.fieldId, f.role])\n );\n for (const f of defaultMinimalFullLengthFields) {\n f.role = fieldIdToDefaultRole.get(f.fieldId);\n }\n\n // Now we have the defaults!\n //\n // We once again derive field configs, this time using existing props.\n // Then we add on the derived defaults for the \"real merged\" fields.\n //\n // Note this is kind of an awkward/wasteful use of deriveFieldConfigs since it was more for table columns originally, and this by-role usage is a different shape of problem. We're mainly using it to fill in / \"inflate\" the additional settings on these FieldConfigs. Haven't yet bothered finding a better utility interface.\n const { mergedFields, minimalFullLengthFields } =\n doDeriveFieldConfigs(\"existing\");\n\n const minimalFullLengthFieldsWithDefaults = [\n ...minimalFullLengthFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMinimalFullLengthFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n const mergedFieldsWithDefaults = [\n ...mergedFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMergedFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n\n // We now get by-role grouping which is needed by the component.\n const roleConfigs = ensure(\n groupBy(mergedFieldsWithDefaults, (f) => f.role)\n );\n\n const finalRoles: Partial<Record<Role, EventsConfig[]>> = {};\n for (const role of roles) {\n if (role !== \"unset\") {\n finalRoles[role] = maybe(props[role], ensureArray) ?? roleConfigs[role];\n }\n }\n\n setControlContextData?.({\n ...data,\n mergedFields: mergedFieldsWithDefaults,\n minimalFullLengthFields: minimalFullLengthFieldsWithDefaults,\n });\n\n const normalized = mergedFieldsWithDefaults;\n return { normalized, finalRoles };\n }, [data, setControlContextData, props]);\n}\n","import dayjs, { Dayjs } from \"dayjs\";\nimport { roleProp } from \"../common-prop-types\";\nimport {\n isValidIsoDate,\n Registerable,\n registerComponentHelper,\n} from \"../utils\";\nimport { RichCalendar } from \"./RichCalendar\";\n\nexport * from \"./RichCalendar\";\n\nexport const calendarHelpers = {\n states: {\n mode: {\n onChangeArgsToValue: (_date: Dayjs, mode: string) => mode,\n },\n selectedDate: {\n onChangeArgsToValue: (date: Dayjs) => dayjs(date).toISOString(),\n },\n },\n};\n\nexport const calendarComponentName = \"hostless-rich-calendar\";\n\nexport function registerRichCalendar(loader?: Registerable) {\n registerComponentHelper(loader, RichCalendar, {\n name: calendarComponentName,\n displayName: \"Calendar\",\n props: {\n data: {\n type: \"dataSourceOpData\" as any,\n description:\n \"The data to display. Should be a list of records with some date field.\",\n },\n title: roleProp({ role: \"title\" }),\n date: roleProp({ role: \"date\", singular: true }),\n color: roleProp({ role: \"color\", singular: true }),\n value: {\n // Must have a corresponding state and eventhandler for any prop that I want to be able to change in interactive mode.\n editOnly: true,\n uncontrolledProp: \"defaultValue\",\n type: \"dateString\",\n description: `The date selected by default as an ISO string`,\n validator: (value, ps) => {\n if (!ps.value) return true;\n if (!ps.validRange) return true;\n if (!isValidIsoDate(value)) return \"Not a valid ISO string.\";\n if (\n dayjs(value).isBefore(ps.validRange[0]) ||\n dayjs(value).isAfter(ps.validRange[1])\n )\n return \"Not within the valid range\";\n return true;\n },\n },\n mode: {\n type: \"choice\",\n options: [\"month\", \"year\"],\n description: \"The default display mode of the calendar.\",\n defaultValueHint: \"month\",\n },\n validRange: {\n type: \"dateRangeStrings\",\n description: \"Only allow selection of dates that lie within this range\",\n advanced: true,\n validator: (value, ps) => {\n if (!value) return true;\n if (!Array.isArray(value) || value.length !== 2)\n return \"Not an array with 2 items\";\n if (!isValidIsoDate(value[0]) || !isValidIsoDate(value[1]))\n return \"Min or max range is not in valid ISO date format.\";\n return true;\n },\n },\n headerRender: {\n type: \"slot\",\n renderPropParams: [\"headerProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Header\",\n },\n dateCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Date Cell\",\n },\n dateFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Date Cell\",\n },\n monthCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Month Cell\",\n },\n monthFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Month Cell\",\n },\n onPanelChange: {\n type: \"eventHandler\",\n description:\n \"Triggers when the calendar mode changes (e.g. from month to year mode)\",\n argTypes: [\n { name: \"date\", type: \"object\" },\n { name: \"mode\", type: \"string\" },\n ],\n },\n onChange: {\n type: \"eventHandler\",\n argTypes: [{ name: \"date\", type: \"object\" }],\n },\n },\n states: {\n mode: {\n type: \"writable\",\n valueProp: \"mode\",\n onChangeProp: \"onPanelChange\",\n variableType: \"text\",\n ...calendarHelpers.states.mode,\n },\n selectedDate: {\n type: \"writable\",\n valueProp: \"value\",\n onChangeProp: \"onChange\",\n variableType: \"text\",\n ...calendarHelpers.states.selectedDate,\n },\n },\n componentHelpers: {\n helpers: calendarHelpers,\n importName: \"calendarHelpers\",\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n },\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n importName: \"RichCalendar\",\n });\n}\n"],"names":["dayjs","weekday","localeData","parseDate","React","Badge","useNormalizedData","useMemo","getFieldAggregateValue","isValidIsoDate","Calendar","__spreadValues","mkShortId","_a","ensureArray","deriveFieldConfigs","isLikeDate","isLikeColor","ensure","groupBy","maybe","registerComponentHelper","roleProp"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/rich-calendar/RichCalendar.tsx","../../src/rich-calendar/index.tsx"],"sourcesContent":["import {\n deriveFieldConfigs,\n NormalizedData,\n useNormalizedData,\n} from \"@plasmicapp/data-sources\";\nimport { parseDate } from \"@plasmicpkgs/luxon-parser\";\nimport { Badge, Calendar } from \"antd\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport groupBy from \"lodash/groupBy\";\nimport React, { useMemo } from \"react\";\nimport { BaseColumnConfig, FieldfulProps, RowFunc } from \"../field-mappings\";\nimport { getFieldAggregateValue } from \"../formatting\";\nimport {\n ensure,\n ensureArray,\n isLikeColor,\n isLikeDate,\n isValidIsoDate,\n maybe,\n mkShortId,\n} from \"../utils\";\n\nimport localeData from \"dayjs/plugin/localeData\";\nimport weekday from \"dayjs/plugin/weekday\";\n\ndayjs.extend(weekday);\ndayjs.extend(localeData);\n\ntype RichCalendarPropsBase = Omit<\n React.ComponentProps<typeof Calendar>,\n \"value\" | \"defaultValue\" | \"validRange\"\n>;\n\nexport interface RichCalendarProps\n extends FieldfulProps<EventsConfig>,\n RichCalendarPropsBase {\n color: EventsConfig[];\n date: EventsConfig[];\n title: EventsConfig[];\n value: string;\n defaultValue: string;\n validRange: [string | undefined, string | undefined] | undefined;\n}\n\ninterface Event {\n date: string;\n title: string;\n color?: string;\n}\n\nfunction getEventFullDate(date?: string): string | undefined {\n const parsed = parseDate(date);\n if (!parsed) return undefined;\n const yyyy = parsed.getFullYear();\n const mm = (parsed.getMonth() + 1).toString().padStart(2, \"0\");\n const dd = parsed.getDate().toString().padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd}`;\n}\n\nfunction getEventMonthYear(date?: string): string | undefined {\n return getEventFullDate(date)?.substring(0, 7);\n}\n\nfunction EventCell({ events }: { events: Event[] }) {\n if (!events || !events.length) return null;\n return (\n <ul style={{ all: \"unset\" }}>\n {events.map((e) => (\n <li key={JSON.stringify(e)} style={{ all: \"unset\", display: \"block\" }}>\n <Badge color={e.color || \"green\"} text={e.title} />\n </li>\n ))}\n </ul>\n );\n}\n\nexport function RichCalendar(props: RichCalendarProps) {\n const {\n data: rawData = {\n data: [],\n schema: {\n id: \"inferred\",\n fields: [\n {\n id: \"id\",\n type: \"string\",\n readOnly: false,\n },\n ],\n },\n },\n value: isoValue,\n defaultValue: isoDefaultValue,\n validRange: isoValidRange,\n dateCellRender,\n dateFullCellRender,\n monthCellRender,\n monthFullCellRender,\n ...rest\n } = props;\n const data = useNormalizedData(rawData);\n\n const { normalized, finalRoles: roleConfigs } = useRoleDefinitions(\n data,\n props\n );\n const {\n eventsByDate,\n eventsByMonth,\n }: {\n eventsByDate: Record<string, Event[]>;\n eventsByMonth: Record<string, Event[]>;\n } = useMemo(() => {\n if (!data) return { eventsByDate: {}, eventsByMonth: {} };\n return data?.data.reduce(\n (acc: any, item: any) => {\n const date = getFieldAggregateValue(item, roleConfigs.date);\n const title = getFieldAggregateValue(item, roleConfigs.title);\n const color = getFieldAggregateValue(item, roleConfigs.color);\n\n const event = {\n date,\n title,\n color,\n };\n\n const keyDate = getEventFullDate(date); // extract the date-only part\n const keyMonth = getEventMonthYear(date); // extract the month-year part\n if (keyDate && keyMonth) {\n acc.eventsByDate[keyDate] = [\n ...(acc.eventsByDate[keyDate] || []),\n event,\n ];\n acc.eventsByMonth[keyMonth] = [\n ...(acc.eventsByMonth[keyMonth] || []),\n event,\n ];\n }\n\n return acc;\n },\n { eventsByDate: {}, eventsByMonth: {} }\n );\n }, [data, roleConfigs.color, roleConfigs.date, roleConfigs.title]);\n\n const value = useMemo(\n () => (isValidIsoDate(isoValue) ? dayjs(isoValue) : dayjs()),\n [isoValue]\n ); // https://day.js.org/docs/en/parse/now`\n const defaultValue = useMemo(\n () => (isValidIsoDate(isoDefaultValue) ? dayjs(isoDefaultValue) : dayjs()),\n [isoDefaultValue]\n ); // https://day.js.org/docs/en/parse/now\n\n const validRange: [Dayjs, Dayjs] | undefined = useMemo(() => {\n if (!isoValidRange) return undefined;\n\n const range = isoValidRange\n .filter((dateIso: string | undefined) => isValidIsoDate(dateIso))\n .map((d: any) => dayjs(d));\n\n if (range.length !== 2) return undefined;\n return [range[0], range[1]];\n }, [isoValidRange]);\n\n const key = useMemo(() => JSON.stringify(roleConfigs), [roleConfigs]);\n\n return (\n <Calendar\n {...rest}\n key={key}\n validRange={validRange}\n // for interactive / preview mode\n defaultValue={defaultValue}\n // for design mode\n value={value}\n dateCellRender={\n dateCellRender\n ? dateCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByDate[getEventFullDate(date.toISOString())!]}\n />\n )\n }\n monthCellRender={\n monthCellRender\n ? monthCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByMonth[getEventMonthYear(date.toISOString())!]}\n />\n )\n }\n dateFullCellRender={dateFullCellRender}\n monthFullCellRender={monthFullCellRender}\n />\n );\n}\n\ninterface StyleConfig {\n styles: Record<string, any>;\n align: \"left\" | \"center\" | \"right\";\n freeze: \"off\" | \"left\" | \"right\";\n}\n\nconst defaultColumnConfig = (): EventsConfig =>\n ({\n key: mkShortId(),\n isEditableExpr: () => false,\n disableSorting: false,\n sortByExpr: undefined,\n isHidden: false,\n formatting: {\n styles: {},\n align: \"left\",\n freeze: \"off\",\n },\n dataType: \"auto\" as const,\n role: undefined,\n } as const);\n\nconst roles = [\"date\", \"title\", \"color\", \"unset\"] as const;\n\nexport type Role = (typeof roles)[number];\n\nexport type EventsConfig = BaseColumnConfig & {\n isEditableExpr: RowFunc<boolean>;\n disableSorting: boolean;\n sortByExpr?: RowFunc<any>;\n formatting: StyleConfig;\n\n /**\n * The default inferred role, not the actual user-set role.\n */\n role: undefined | Role | \"unset\";\n};\n\n// This component is different from Table/Details since it has various different roles, so the UX is one of setting the choices for each role rather than a single list of fields.\n//\n// We first infer the defaults for each role.\n// This we always need to do because we want the choices to be 'stable'.\n// If the user sets one of the roles, without setting the others, we don't want to shift things around on the other roles as a result.\n// So the defaults need to always be there (they would only be irrelevant if all roles that would have had defaults were set/overridden by the user).\n//\n// Then, we layer on the user role choices.\n//\n// One UX wart is that unsetting a role will restore the default selection instead of clearing it.\n// User must know to actually set fieldId to none or (for arrays) remove the item.\n// Just another reason to fill in few roles by default.\nfunction useRoleDefinitions(\n data: NormalizedData | undefined,\n props: React.ComponentProps<typeof RichCalendar>\n) {\n const { fields, setControlContextData } = props;\n\n return React.useMemo(() => {\n const schema = data?.schema;\n if (!data || !schema) {\n return { normalized: [], finalRoles: {} };\n }\n\n function tagFieldConfigs(role: Role) {\n if (role !== \"unset\") {\n return ensureArray(props[role] ?? []).map((field) => {\n return {\n ...field,\n role,\n };\n });\n } else {\n return [];\n }\n }\n\n // This is only being computed to get the default role choices.\n const specifiedFieldsPartial = [\n ...tagFieldConfigs(\"date\"),\n ...tagFieldConfigs(\"color\"),\n ...tagFieldConfigs(\"title\"),\n ];\n\n function doDeriveFieldConfigs(mode: \"existing\" | \"defaults\") {\n return deriveFieldConfigs<EventsConfig>(\n mode === \"defaults\" ? [] : specifiedFieldsPartial,\n schema,\n (field) => ({\n ...defaultColumnConfig(),\n ...(field && {\n key: field.id,\n fieldId: field.id,\n title: field.label || field.id,\n // undefined means not yet determined in this routine, not 'unset'\n role: undefined,\n expr: (currentItem) => currentItem[field.id],\n }),\n })\n );\n }\n\n // Now we derive the defaults.\n //\n // We always start from a blank slate for this. We want stability - we don't want a situation where we are constantly shifting around the defaults based on what else the user has set.\n //\n // For instance,\n // (1) we derive `city` to be content,\n // (2) user sets `city` as title,\n // (3) we now derive a different content because `city` is used.\n const {\n mergedFields: defaultMergedFields,\n minimalFullLengthFields: defaultMinimalFullLengthFields,\n } = doDeriveFieldConfigs(\"defaults\");\n\n // Find a good default date field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a date in ISO date-only or date-time format, or a timestamp\n // Of these, prefer the one with a name like date, timestamp.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"date\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const dateFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeDate(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const dateField =\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/^(date|datetime|timestamp|eventdate)$/i)\n ) ??\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(date|time|event).*/i)\n ) ??\n dateFieldCandidates[0];\n if (dateField) {\n dateField.role = \"date\";\n }\n }\n\n // Find a good default color field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a color code.\n // Of these, prefer the one with a name like color.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"color\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const colorFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeColor(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const colorField =\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/^(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb)$/i)\n ) ??\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb).*/i)\n ) ??\n colorFieldCandidates[0];\n if (colorField) {\n colorField.role = \"color\";\n }\n }\n\n // Find a good default title field, just based on the field name.\n if (!defaultMergedFields.some((field) => field.role === \"title\")) {\n const titleField = defaultMergedFields.find(\n (field) =>\n !field.role &&\n field.fieldId?.toLowerCase().match(/^(title|name||event[ _-]?name)$/)\n );\n if (titleField) {\n titleField.role = \"title\";\n }\n }\n\n const fieldIdToDefaultRole = new Map(\n defaultMergedFields.map((f) => [f.fieldId, f.role])\n );\n for (const f of defaultMinimalFullLengthFields) {\n f.role = fieldIdToDefaultRole.get(f.fieldId);\n }\n\n // Now we have the defaults!\n //\n // We once again derive field configs, this time using existing props.\n // Then we add on the derived defaults for the \"real merged\" fields.\n //\n // Note this is kind of an awkward/wasteful use of deriveFieldConfigs since it was more for table columns originally, and this by-role usage is a different shape of problem. We're mainly using it to fill in / \"inflate\" the additional settings on these FieldConfigs. Haven't yet bothered finding a better utility interface.\n const { mergedFields, minimalFullLengthFields } =\n doDeriveFieldConfigs(\"existing\");\n\n const minimalFullLengthFieldsWithDefaults = [\n ...minimalFullLengthFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMinimalFullLengthFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n const mergedFieldsWithDefaults = [\n ...mergedFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMergedFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n\n // We now get by-role grouping which is needed by the component.\n const roleConfigs = ensure(\n groupBy(mergedFieldsWithDefaults, (f) => f.role)\n );\n\n const finalRoles: Partial<Record<Role, EventsConfig[]>> = {};\n for (const role of roles) {\n if (role !== \"unset\") {\n finalRoles[role] = maybe(props[role], ensureArray) ?? roleConfigs[role];\n }\n }\n\n setControlContextData?.({\n ...data,\n mergedFields: mergedFieldsWithDefaults,\n minimalFullLengthFields: minimalFullLengthFieldsWithDefaults,\n });\n\n const normalized = mergedFieldsWithDefaults;\n return { normalized, finalRoles };\n }, [data, setControlContextData, props]);\n}\n","import dayjs, { Dayjs } from \"dayjs\";\nimport { roleProp } from \"../common-prop-types\";\nimport {\n isValidIsoDate,\n Registerable,\n registerComponentHelper,\n} from \"../utils\";\nimport { RichCalendar } from \"./RichCalendar\";\n\nexport * from \"./RichCalendar\";\n\nexport const calendarHelpers = {\n states: {\n mode: {\n onChangeArgsToValue: (_date: Dayjs, mode: string) => mode,\n },\n selectedDate: {\n onChangeArgsToValue: (date: Dayjs) => dayjs(date).toISOString(),\n },\n },\n};\n\nexport const calendarComponentName = \"hostless-rich-calendar\";\n\nexport function registerRichCalendar(loader?: Registerable) {\n registerComponentHelper(loader, RichCalendar, {\n name: calendarComponentName,\n displayName: \"Calendar\",\n props: {\n data: {\n type: \"dataSourceOpData\" as any,\n displayName: \"Events\",\n description:\n \"The events data should be a list of records with some date field.\",\n },\n title: roleProp({ role: \"title\" }),\n date: roleProp({ role: \"date\", singular: true }),\n color: roleProp({ role: \"color\", singular: true }),\n value: {\n // Must have a corresponding state and eventhandler for any prop that I want to be able to change in interactive mode.\n editOnly: true,\n uncontrolledProp: \"defaultValue\",\n type: \"dateString\",\n description: `The date selected by default as an ISO string`,\n validator: (value, ps) => {\n if (!ps.value) return true;\n if (!ps.validRange) return true;\n if (!isValidIsoDate(value)) return \"Not a valid ISO string.\";\n if (\n dayjs(value).isBefore(ps.validRange[0]) ||\n dayjs(value).isAfter(ps.validRange[1])\n )\n return \"Not within the valid range\";\n return true;\n },\n },\n mode: {\n type: \"choice\",\n options: [\"month\", \"year\"],\n description: \"The default display mode of the calendar.\",\n defaultValueHint: \"month\",\n },\n validRange: {\n type: \"dateRangeStrings\",\n description: \"Only allow selection of dates that lie within this range\",\n advanced: true,\n validator: (value, ps) => {\n if (!value) return true;\n if (!Array.isArray(value) || value.length !== 2)\n return \"Not an array with 2 items\";\n if (!isValidIsoDate(value[0]) || !isValidIsoDate(value[1]))\n return \"Min or max range is not in valid ISO date format.\";\n return true;\n },\n },\n headerRender: {\n type: \"slot\",\n renderPropParams: [\"headerProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Header\",\n },\n dateCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Date Cell\",\n },\n dateFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Date Cell\",\n },\n monthCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Month Cell\",\n },\n monthFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Month Cell\",\n },\n onPanelChange: {\n type: \"eventHandler\",\n description:\n \"Triggers when the calendar mode changes (e.g. from month to year mode)\",\n argTypes: [\n { name: \"date\", type: \"object\" },\n { name: \"mode\", type: \"string\" },\n ],\n },\n onChange: {\n type: \"eventHandler\",\n argTypes: [{ name: \"date\", type: \"object\" }],\n },\n },\n states: {\n mode: {\n type: \"writable\",\n valueProp: \"mode\",\n onChangeProp: \"onPanelChange\",\n variableType: \"text\",\n ...calendarHelpers.states.mode,\n },\n selectedDate: {\n type: \"writable\",\n valueProp: \"value\",\n onChangeProp: \"onChange\",\n variableType: \"text\",\n ...calendarHelpers.states.selectedDate,\n },\n },\n componentHelpers: {\n helpers: calendarHelpers,\n importName: \"calendarHelpers\",\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n },\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n importName: \"RichCalendar\",\n });\n}\n"],"names":["dayjs","weekday","localeData","parseDate","React","Badge","useNormalizedData","useMemo","getFieldAggregateValue","isValidIsoDate","Calendar","__spreadValues","mkShortId","_a","ensureArray","deriveFieldConfigs","isLikeDate","isLikeColor","ensure","groupBy","maybe","registerComponentHelper","roleProp"],"mappings":"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"}
@@ -374,7 +374,8 @@ function registerRichCalendar(loader) {
374
374
  props: {
375
375
  data: {
376
376
  type: "dataSourceOpData",
377
- description: "The data to display. Should be a list of records with some date field."
377
+ displayName: "Events",
378
+ description: "The events data should be a list of records with some date field."
378
379
  },
379
380
  title: roleProp({ role: "title" }),
380
381
  date: roleProp({ role: "date", singular: true }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/rich-calendar/RichCalendar.tsx","../../src/rich-calendar/index.tsx"],"sourcesContent":["import {\n deriveFieldConfigs,\n NormalizedData,\n useNormalizedData,\n} from \"@plasmicapp/data-sources\";\nimport { parseDate } from \"@plasmicpkgs/luxon-parser\";\nimport { Badge, Calendar } from \"antd\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport groupBy from \"lodash/groupBy\";\nimport React, { useMemo } from \"react\";\nimport { BaseColumnConfig, FieldfulProps, RowFunc } from \"../field-mappings\";\nimport { getFieldAggregateValue } from \"../formatting\";\nimport {\n ensure,\n ensureArray,\n isLikeColor,\n isLikeDate,\n isValidIsoDate,\n maybe,\n mkShortId,\n} from \"../utils\";\n\nimport localeData from \"dayjs/plugin/localeData\";\nimport weekday from \"dayjs/plugin/weekday\";\n\ndayjs.extend(weekday);\ndayjs.extend(localeData);\n\ntype RichCalendarPropsBase = Omit<\n React.ComponentProps<typeof Calendar>,\n \"value\" | \"defaultValue\" | \"validRange\"\n>;\n\nexport interface RichCalendarProps\n extends FieldfulProps<EventsConfig>,\n RichCalendarPropsBase {\n color: EventsConfig[];\n date: EventsConfig[];\n title: EventsConfig[];\n value: string;\n defaultValue: string;\n validRange: [string | undefined, string | undefined] | undefined;\n}\n\ninterface Event {\n date: string;\n title: string;\n color?: string;\n}\n\nfunction getEventFullDate(date?: string): string | undefined {\n const parsed = parseDate(date);\n if (!parsed) return undefined;\n const yyyy = parsed.getFullYear();\n const mm = (parsed.getMonth() + 1).toString().padStart(2, \"0\");\n const dd = parsed.getDate().toString().padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd}`;\n}\n\nfunction getEventMonthYear(date?: string): string | undefined {\n return getEventFullDate(date)?.substring(0, 7);\n}\n\nfunction EventCell({ events }: { events: Event[] }) {\n if (!events || !events.length) return null;\n return (\n <ul style={{ all: \"unset\" }}>\n {events.map((e) => (\n <li key={JSON.stringify(e)} style={{ all: \"unset\", display: \"block\" }}>\n <Badge color={e.color || \"green\"} text={e.title} />\n </li>\n ))}\n </ul>\n );\n}\n\nexport function RichCalendar(props: RichCalendarProps) {\n const {\n data: rawData = {\n data: [],\n schema: {\n id: \"inferred\",\n fields: [\n {\n id: \"id\",\n type: \"string\",\n readOnly: false,\n },\n ],\n },\n },\n value: isoValue,\n defaultValue: isoDefaultValue,\n validRange: isoValidRange,\n dateCellRender,\n dateFullCellRender,\n monthCellRender,\n monthFullCellRender,\n ...rest\n } = props;\n const data = useNormalizedData(rawData);\n\n const { normalized, finalRoles: roleConfigs } = useRoleDefinitions(\n data,\n props\n );\n const {\n eventsByDate,\n eventsByMonth,\n }: {\n eventsByDate: Record<string, Event[]>;\n eventsByMonth: Record<string, Event[]>;\n } = useMemo(() => {\n if (!data) return { eventsByDate: {}, eventsByMonth: {} };\n return data?.data.reduce(\n (acc: any, item: any) => {\n const date = getFieldAggregateValue(item, roleConfigs.date);\n const title = getFieldAggregateValue(item, roleConfigs.title);\n const color = getFieldAggregateValue(item, roleConfigs.color);\n\n const event = {\n date,\n title,\n color,\n };\n\n const keyDate = getEventFullDate(date); // extract the date-only part\n const keyMonth = getEventMonthYear(date); // extract the month-year part\n if (keyDate && keyMonth) {\n acc.eventsByDate[keyDate] = [\n ...(acc.eventsByDate[keyDate] || []),\n event,\n ];\n acc.eventsByMonth[keyMonth] = [\n ...(acc.eventsByMonth[keyMonth] || []),\n event,\n ];\n }\n\n return acc;\n },\n { eventsByDate: {}, eventsByMonth: {} }\n );\n }, [data, roleConfigs.color, roleConfigs.date, roleConfigs.title]);\n\n const value = useMemo(\n () => (isValidIsoDate(isoValue) ? dayjs(isoValue) : dayjs()),\n [isoValue]\n ); // https://day.js.org/docs/en/parse/now`\n const defaultValue = useMemo(\n () => (isValidIsoDate(isoDefaultValue) ? dayjs(isoDefaultValue) : dayjs()),\n [isoDefaultValue]\n ); // https://day.js.org/docs/en/parse/now\n\n const validRange: [Dayjs, Dayjs] | undefined = useMemo(() => {\n if (!isoValidRange) return undefined;\n\n const range = isoValidRange\n .filter((dateIso: string | undefined) => isValidIsoDate(dateIso))\n .map((d: any) => dayjs(d));\n\n if (range.length !== 2) return undefined;\n return [range[0], range[1]];\n }, [isoValidRange]);\n\n const key = useMemo(() => JSON.stringify(roleConfigs), [roleConfigs]);\n\n return (\n <Calendar\n {...rest}\n key={key}\n validRange={validRange}\n // for interactive / preview mode\n defaultValue={defaultValue}\n // for design mode\n value={value}\n dateCellRender={\n dateCellRender\n ? dateCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByDate[getEventFullDate(date.toISOString())!]}\n />\n )\n }\n monthCellRender={\n monthCellRender\n ? monthCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByMonth[getEventMonthYear(date.toISOString())!]}\n />\n )\n }\n dateFullCellRender={dateFullCellRender}\n monthFullCellRender={monthFullCellRender}\n />\n );\n}\n\ninterface StyleConfig {\n styles: Record<string, any>;\n align: \"left\" | \"center\" | \"right\";\n freeze: \"off\" | \"left\" | \"right\";\n}\n\nconst defaultColumnConfig = (): EventsConfig =>\n ({\n key: mkShortId(),\n isEditableExpr: () => false,\n disableSorting: false,\n sortByExpr: undefined,\n isHidden: false,\n formatting: {\n styles: {},\n align: \"left\",\n freeze: \"off\",\n },\n dataType: \"auto\" as const,\n role: undefined,\n } as const);\n\nconst roles = [\"date\", \"title\", \"color\", \"unset\"] as const;\n\nexport type Role = (typeof roles)[number];\n\nexport type EventsConfig = BaseColumnConfig & {\n isEditableExpr: RowFunc<boolean>;\n disableSorting: boolean;\n sortByExpr?: RowFunc<any>;\n formatting: StyleConfig;\n\n /**\n * The default inferred role, not the actual user-set role.\n */\n role: undefined | Role | \"unset\";\n};\n\n// This component is different from Table/Details since it has various different roles, so the UX is one of setting the choices for each role rather than a single list of fields.\n//\n// We first infer the defaults for each role.\n// This we always need to do because we want the choices to be 'stable'.\n// If the user sets one of the roles, without setting the others, we don't want to shift things around on the other roles as a result.\n// So the defaults need to always be there (they would only be irrelevant if all roles that would have had defaults were set/overridden by the user).\n//\n// Then, we layer on the user role choices.\n//\n// One UX wart is that unsetting a role will restore the default selection instead of clearing it.\n// User must know to actually set fieldId to none or (for arrays) remove the item.\n// Just another reason to fill in few roles by default.\nfunction useRoleDefinitions(\n data: NormalizedData | undefined,\n props: React.ComponentProps<typeof RichCalendar>\n) {\n const { fields, setControlContextData } = props;\n\n return React.useMemo(() => {\n const schema = data?.schema;\n if (!data || !schema) {\n return { normalized: [], finalRoles: {} };\n }\n\n function tagFieldConfigs(role: Role) {\n if (role !== \"unset\") {\n return ensureArray(props[role] ?? []).map((field) => {\n return {\n ...field,\n role,\n };\n });\n } else {\n return [];\n }\n }\n\n // This is only being computed to get the default role choices.\n const specifiedFieldsPartial = [\n ...tagFieldConfigs(\"date\"),\n ...tagFieldConfigs(\"color\"),\n ...tagFieldConfigs(\"title\"),\n ];\n\n function doDeriveFieldConfigs(mode: \"existing\" | \"defaults\") {\n return deriveFieldConfigs<EventsConfig>(\n mode === \"defaults\" ? [] : specifiedFieldsPartial,\n schema,\n (field) => ({\n ...defaultColumnConfig(),\n ...(field && {\n key: field.id,\n fieldId: field.id,\n title: field.label || field.id,\n // undefined means not yet determined in this routine, not 'unset'\n role: undefined,\n expr: (currentItem) => currentItem[field.id],\n }),\n })\n );\n }\n\n // Now we derive the defaults.\n //\n // We always start from a blank slate for this. We want stability - we don't want a situation where we are constantly shifting around the defaults based on what else the user has set.\n //\n // For instance,\n // (1) we derive `city` to be content,\n // (2) user sets `city` as title,\n // (3) we now derive a different content because `city` is used.\n const {\n mergedFields: defaultMergedFields,\n minimalFullLengthFields: defaultMinimalFullLengthFields,\n } = doDeriveFieldConfigs(\"defaults\");\n\n // Find a good default date field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a date in ISO date-only or date-time format, or a timestamp\n // Of these, prefer the one with a name like date, timestamp.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"date\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const dateFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeDate(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const dateField =\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/^(date|datetime|timestamp|eventdate)$/i)\n ) ??\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(date|time|event).*/i)\n ) ??\n dateFieldCandidates[0];\n if (dateField) {\n dateField.role = \"date\";\n }\n }\n\n // Find a good default color field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a color code.\n // Of these, prefer the one with a name like color.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"color\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const colorFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeColor(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const colorField =\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/^(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb)$/i)\n ) ??\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb).*/i)\n ) ??\n colorFieldCandidates[0];\n if (colorField) {\n colorField.role = \"color\";\n }\n }\n\n // Find a good default title field, just based on the field name.\n if (!defaultMergedFields.some((field) => field.role === \"title\")) {\n const titleField = defaultMergedFields.find(\n (field) =>\n !field.role &&\n field.fieldId?.toLowerCase().match(/^(title|name||event[ _-]?name)$/)\n );\n if (titleField) {\n titleField.role = \"title\";\n }\n }\n\n const fieldIdToDefaultRole = new Map(\n defaultMergedFields.map((f) => [f.fieldId, f.role])\n );\n for (const f of defaultMinimalFullLengthFields) {\n f.role = fieldIdToDefaultRole.get(f.fieldId);\n }\n\n // Now we have the defaults!\n //\n // We once again derive field configs, this time using existing props.\n // Then we add on the derived defaults for the \"real merged\" fields.\n //\n // Note this is kind of an awkward/wasteful use of deriveFieldConfigs since it was more for table columns originally, and this by-role usage is a different shape of problem. We're mainly using it to fill in / \"inflate\" the additional settings on these FieldConfigs. Haven't yet bothered finding a better utility interface.\n const { mergedFields, minimalFullLengthFields } =\n doDeriveFieldConfigs(\"existing\");\n\n const minimalFullLengthFieldsWithDefaults = [\n ...minimalFullLengthFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMinimalFullLengthFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n const mergedFieldsWithDefaults = [\n ...mergedFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMergedFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n\n // We now get by-role grouping which is needed by the component.\n const roleConfigs = ensure(\n groupBy(mergedFieldsWithDefaults, (f) => f.role)\n );\n\n const finalRoles: Partial<Record<Role, EventsConfig[]>> = {};\n for (const role of roles) {\n if (role !== \"unset\") {\n finalRoles[role] = maybe(props[role], ensureArray) ?? roleConfigs[role];\n }\n }\n\n setControlContextData?.({\n ...data,\n mergedFields: mergedFieldsWithDefaults,\n minimalFullLengthFields: minimalFullLengthFieldsWithDefaults,\n });\n\n const normalized = mergedFieldsWithDefaults;\n return { normalized, finalRoles };\n }, [data, setControlContextData, props]);\n}\n","import dayjs, { Dayjs } from \"dayjs\";\nimport { roleProp } from \"../common-prop-types\";\nimport {\n isValidIsoDate,\n Registerable,\n registerComponentHelper,\n} from \"../utils\";\nimport { RichCalendar } from \"./RichCalendar\";\n\nexport * from \"./RichCalendar\";\n\nexport const calendarHelpers = {\n states: {\n mode: {\n onChangeArgsToValue: (_date: Dayjs, mode: string) => mode,\n },\n selectedDate: {\n onChangeArgsToValue: (date: Dayjs) => dayjs(date).toISOString(),\n },\n },\n};\n\nexport const calendarComponentName = \"hostless-rich-calendar\";\n\nexport function registerRichCalendar(loader?: Registerable) {\n registerComponentHelper(loader, RichCalendar, {\n name: calendarComponentName,\n displayName: \"Calendar\",\n props: {\n data: {\n type: \"dataSourceOpData\" as any,\n description:\n \"The data to display. Should be a list of records with some date field.\",\n },\n title: roleProp({ role: \"title\" }),\n date: roleProp({ role: \"date\", singular: true }),\n color: roleProp({ role: \"color\", singular: true }),\n value: {\n // Must have a corresponding state and eventhandler for any prop that I want to be able to change in interactive mode.\n editOnly: true,\n uncontrolledProp: \"defaultValue\",\n type: \"dateString\",\n description: `The date selected by default as an ISO string`,\n validator: (value, ps) => {\n if (!ps.value) return true;\n if (!ps.validRange) return true;\n if (!isValidIsoDate(value)) return \"Not a valid ISO string.\";\n if (\n dayjs(value).isBefore(ps.validRange[0]) ||\n dayjs(value).isAfter(ps.validRange[1])\n )\n return \"Not within the valid range\";\n return true;\n },\n },\n mode: {\n type: \"choice\",\n options: [\"month\", \"year\"],\n description: \"The default display mode of the calendar.\",\n defaultValueHint: \"month\",\n },\n validRange: {\n type: \"dateRangeStrings\",\n description: \"Only allow selection of dates that lie within this range\",\n advanced: true,\n validator: (value, ps) => {\n if (!value) return true;\n if (!Array.isArray(value) || value.length !== 2)\n return \"Not an array with 2 items\";\n if (!isValidIsoDate(value[0]) || !isValidIsoDate(value[1]))\n return \"Min or max range is not in valid ISO date format.\";\n return true;\n },\n },\n headerRender: {\n type: \"slot\",\n renderPropParams: [\"headerProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Header\",\n },\n dateCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Date Cell\",\n },\n dateFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Date Cell\",\n },\n monthCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Month Cell\",\n },\n monthFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Month Cell\",\n },\n onPanelChange: {\n type: \"eventHandler\",\n description:\n \"Triggers when the calendar mode changes (e.g. from month to year mode)\",\n argTypes: [\n { name: \"date\", type: \"object\" },\n { name: \"mode\", type: \"string\" },\n ],\n },\n onChange: {\n type: \"eventHandler\",\n argTypes: [{ name: \"date\", type: \"object\" }],\n },\n },\n states: {\n mode: {\n type: \"writable\",\n valueProp: \"mode\",\n onChangeProp: \"onPanelChange\",\n variableType: \"text\",\n ...calendarHelpers.states.mode,\n },\n selectedDate: {\n type: \"writable\",\n valueProp: \"value\",\n onChangeProp: \"onChange\",\n variableType: \"text\",\n ...calendarHelpers.states.selectedDate,\n },\n },\n componentHelpers: {\n helpers: calendarHelpers,\n importName: \"calendarHelpers\",\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n },\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n importName: \"RichCalendar\",\n });\n}\n"],"names":["__spreadValues","_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/rich-calendar/RichCalendar.tsx","../../src/rich-calendar/index.tsx"],"sourcesContent":["import {\n deriveFieldConfigs,\n NormalizedData,\n useNormalizedData,\n} from \"@plasmicapp/data-sources\";\nimport { parseDate } from \"@plasmicpkgs/luxon-parser\";\nimport { Badge, Calendar } from \"antd\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport groupBy from \"lodash/groupBy\";\nimport React, { useMemo } from \"react\";\nimport { BaseColumnConfig, FieldfulProps, RowFunc } from \"../field-mappings\";\nimport { getFieldAggregateValue } from \"../formatting\";\nimport {\n ensure,\n ensureArray,\n isLikeColor,\n isLikeDate,\n isValidIsoDate,\n maybe,\n mkShortId,\n} from \"../utils\";\n\nimport localeData from \"dayjs/plugin/localeData\";\nimport weekday from \"dayjs/plugin/weekday\";\n\ndayjs.extend(weekday);\ndayjs.extend(localeData);\n\ntype RichCalendarPropsBase = Omit<\n React.ComponentProps<typeof Calendar>,\n \"value\" | \"defaultValue\" | \"validRange\"\n>;\n\nexport interface RichCalendarProps\n extends FieldfulProps<EventsConfig>,\n RichCalendarPropsBase {\n color: EventsConfig[];\n date: EventsConfig[];\n title: EventsConfig[];\n value: string;\n defaultValue: string;\n validRange: [string | undefined, string | undefined] | undefined;\n}\n\ninterface Event {\n date: string;\n title: string;\n color?: string;\n}\n\nfunction getEventFullDate(date?: string): string | undefined {\n const parsed = parseDate(date);\n if (!parsed) return undefined;\n const yyyy = parsed.getFullYear();\n const mm = (parsed.getMonth() + 1).toString().padStart(2, \"0\");\n const dd = parsed.getDate().toString().padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd}`;\n}\n\nfunction getEventMonthYear(date?: string): string | undefined {\n return getEventFullDate(date)?.substring(0, 7);\n}\n\nfunction EventCell({ events }: { events: Event[] }) {\n if (!events || !events.length) return null;\n return (\n <ul style={{ all: \"unset\" }}>\n {events.map((e) => (\n <li key={JSON.stringify(e)} style={{ all: \"unset\", display: \"block\" }}>\n <Badge color={e.color || \"green\"} text={e.title} />\n </li>\n ))}\n </ul>\n );\n}\n\nexport function RichCalendar(props: RichCalendarProps) {\n const {\n data: rawData = {\n data: [],\n schema: {\n id: \"inferred\",\n fields: [\n {\n id: \"id\",\n type: \"string\",\n readOnly: false,\n },\n ],\n },\n },\n value: isoValue,\n defaultValue: isoDefaultValue,\n validRange: isoValidRange,\n dateCellRender,\n dateFullCellRender,\n monthCellRender,\n monthFullCellRender,\n ...rest\n } = props;\n const data = useNormalizedData(rawData);\n\n const { normalized, finalRoles: roleConfigs } = useRoleDefinitions(\n data,\n props\n );\n const {\n eventsByDate,\n eventsByMonth,\n }: {\n eventsByDate: Record<string, Event[]>;\n eventsByMonth: Record<string, Event[]>;\n } = useMemo(() => {\n if (!data) return { eventsByDate: {}, eventsByMonth: {} };\n return data?.data.reduce(\n (acc: any, item: any) => {\n const date = getFieldAggregateValue(item, roleConfigs.date);\n const title = getFieldAggregateValue(item, roleConfigs.title);\n const color = getFieldAggregateValue(item, roleConfigs.color);\n\n const event = {\n date,\n title,\n color,\n };\n\n const keyDate = getEventFullDate(date); // extract the date-only part\n const keyMonth = getEventMonthYear(date); // extract the month-year part\n if (keyDate && keyMonth) {\n acc.eventsByDate[keyDate] = [\n ...(acc.eventsByDate[keyDate] || []),\n event,\n ];\n acc.eventsByMonth[keyMonth] = [\n ...(acc.eventsByMonth[keyMonth] || []),\n event,\n ];\n }\n\n return acc;\n },\n { eventsByDate: {}, eventsByMonth: {} }\n );\n }, [data, roleConfigs.color, roleConfigs.date, roleConfigs.title]);\n\n const value = useMemo(\n () => (isValidIsoDate(isoValue) ? dayjs(isoValue) : dayjs()),\n [isoValue]\n ); // https://day.js.org/docs/en/parse/now`\n const defaultValue = useMemo(\n () => (isValidIsoDate(isoDefaultValue) ? dayjs(isoDefaultValue) : dayjs()),\n [isoDefaultValue]\n ); // https://day.js.org/docs/en/parse/now\n\n const validRange: [Dayjs, Dayjs] | undefined = useMemo(() => {\n if (!isoValidRange) return undefined;\n\n const range = isoValidRange\n .filter((dateIso: string | undefined) => isValidIsoDate(dateIso))\n .map((d: any) => dayjs(d));\n\n if (range.length !== 2) return undefined;\n return [range[0], range[1]];\n }, [isoValidRange]);\n\n const key = useMemo(() => JSON.stringify(roleConfigs), [roleConfigs]);\n\n return (\n <Calendar\n {...rest}\n key={key}\n validRange={validRange}\n // for interactive / preview mode\n defaultValue={defaultValue}\n // for design mode\n value={value}\n dateCellRender={\n dateCellRender\n ? dateCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByDate[getEventFullDate(date.toISOString())!]}\n />\n )\n }\n monthCellRender={\n monthCellRender\n ? monthCellRender\n : (date: Dayjs) => (\n <EventCell\n events={eventsByMonth[getEventMonthYear(date.toISOString())!]}\n />\n )\n }\n dateFullCellRender={dateFullCellRender}\n monthFullCellRender={monthFullCellRender}\n />\n );\n}\n\ninterface StyleConfig {\n styles: Record<string, any>;\n align: \"left\" | \"center\" | \"right\";\n freeze: \"off\" | \"left\" | \"right\";\n}\n\nconst defaultColumnConfig = (): EventsConfig =>\n ({\n key: mkShortId(),\n isEditableExpr: () => false,\n disableSorting: false,\n sortByExpr: undefined,\n isHidden: false,\n formatting: {\n styles: {},\n align: \"left\",\n freeze: \"off\",\n },\n dataType: \"auto\" as const,\n role: undefined,\n } as const);\n\nconst roles = [\"date\", \"title\", \"color\", \"unset\"] as const;\n\nexport type Role = (typeof roles)[number];\n\nexport type EventsConfig = BaseColumnConfig & {\n isEditableExpr: RowFunc<boolean>;\n disableSorting: boolean;\n sortByExpr?: RowFunc<any>;\n formatting: StyleConfig;\n\n /**\n * The default inferred role, not the actual user-set role.\n */\n role: undefined | Role | \"unset\";\n};\n\n// This component is different from Table/Details since it has various different roles, so the UX is one of setting the choices for each role rather than a single list of fields.\n//\n// We first infer the defaults for each role.\n// This we always need to do because we want the choices to be 'stable'.\n// If the user sets one of the roles, without setting the others, we don't want to shift things around on the other roles as a result.\n// So the defaults need to always be there (they would only be irrelevant if all roles that would have had defaults were set/overridden by the user).\n//\n// Then, we layer on the user role choices.\n//\n// One UX wart is that unsetting a role will restore the default selection instead of clearing it.\n// User must know to actually set fieldId to none or (for arrays) remove the item.\n// Just another reason to fill in few roles by default.\nfunction useRoleDefinitions(\n data: NormalizedData | undefined,\n props: React.ComponentProps<typeof RichCalendar>\n) {\n const { fields, setControlContextData } = props;\n\n return React.useMemo(() => {\n const schema = data?.schema;\n if (!data || !schema) {\n return { normalized: [], finalRoles: {} };\n }\n\n function tagFieldConfigs(role: Role) {\n if (role !== \"unset\") {\n return ensureArray(props[role] ?? []).map((field) => {\n return {\n ...field,\n role,\n };\n });\n } else {\n return [];\n }\n }\n\n // This is only being computed to get the default role choices.\n const specifiedFieldsPartial = [\n ...tagFieldConfigs(\"date\"),\n ...tagFieldConfigs(\"color\"),\n ...tagFieldConfigs(\"title\"),\n ];\n\n function doDeriveFieldConfigs(mode: \"existing\" | \"defaults\") {\n return deriveFieldConfigs<EventsConfig>(\n mode === \"defaults\" ? [] : specifiedFieldsPartial,\n schema,\n (field) => ({\n ...defaultColumnConfig(),\n ...(field && {\n key: field.id,\n fieldId: field.id,\n title: field.label || field.id,\n // undefined means not yet determined in this routine, not 'unset'\n role: undefined,\n expr: (currentItem) => currentItem[field.id],\n }),\n })\n );\n }\n\n // Now we derive the defaults.\n //\n // We always start from a blank slate for this. We want stability - we don't want a situation where we are constantly shifting around the defaults based on what else the user has set.\n //\n // For instance,\n // (1) we derive `city` to be content,\n // (2) user sets `city` as title,\n // (3) we now derive a different content because `city` is used.\n const {\n mergedFields: defaultMergedFields,\n minimalFullLengthFields: defaultMinimalFullLengthFields,\n } = doDeriveFieldConfigs(\"defaults\");\n\n // Find a good default date field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a date in ISO date-only or date-time format, or a timestamp\n // Of these, prefer the one with a name like date, timestamp.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"date\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const dateFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeDate(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const dateField =\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/^(date|datetime|timestamp|eventdate)$/i)\n ) ??\n dateFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(date|time|event).*/i)\n ) ??\n dateFieldCandidates[0];\n if (dateField) {\n dateField.role = \"date\";\n }\n }\n\n // Find a good default color field.\n // Filter mergedFields where there are mostly values (in the sampleRows) that are a string that looks like a color code.\n // Of these, prefer the one with a name like color.\n // Otherwise, prefer the one with a name with that substring.\n // Otherwise, pick any remaining one.\n if (\n data.data.length > 0 &&\n !defaultMergedFields.some((field) => field.role === \"color\")\n ) {\n const sampleRows = Array.from(\n new Set(\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) =>\n Math.round((i / 9) * (data.data.length - 1))\n )\n )\n ).map((i) => data.data[i]);\n const colorFieldCandidates = defaultMergedFields.filter(\n (field) =>\n !field.role &&\n sampleRows.filter(\n (row) => field.fieldId && isLikeColor(row[field.fieldId])\n ).length >=\n sampleRows.length / 2\n );\n const colorField =\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/^(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb)$/i)\n ) ??\n colorFieldCandidates.find((f) =>\n f.fieldId?.match(/.*(color|hex|rgb|hsl|rgba|cmyk|hsv|hsb).*/i)\n ) ??\n colorFieldCandidates[0];\n if (colorField) {\n colorField.role = \"color\";\n }\n }\n\n // Find a good default title field, just based on the field name.\n if (!defaultMergedFields.some((field) => field.role === \"title\")) {\n const titleField = defaultMergedFields.find(\n (field) =>\n !field.role &&\n field.fieldId?.toLowerCase().match(/^(title|name||event[ _-]?name)$/)\n );\n if (titleField) {\n titleField.role = \"title\";\n }\n }\n\n const fieldIdToDefaultRole = new Map(\n defaultMergedFields.map((f) => [f.fieldId, f.role])\n );\n for (const f of defaultMinimalFullLengthFields) {\n f.role = fieldIdToDefaultRole.get(f.fieldId);\n }\n\n // Now we have the defaults!\n //\n // We once again derive field configs, this time using existing props.\n // Then we add on the derived defaults for the \"real merged\" fields.\n //\n // Note this is kind of an awkward/wasteful use of deriveFieldConfigs since it was more for table columns originally, and this by-role usage is a different shape of problem. We're mainly using it to fill in / \"inflate\" the additional settings on these FieldConfigs. Haven't yet bothered finding a better utility interface.\n const { mergedFields, minimalFullLengthFields } =\n doDeriveFieldConfigs(\"existing\");\n\n const minimalFullLengthFieldsWithDefaults = [\n ...minimalFullLengthFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMinimalFullLengthFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n const mergedFieldsWithDefaults = [\n ...mergedFields.filter((f) => f.role && f.role !== \"unset\"),\n ...defaultMergedFields.filter(\n (f) => f.role && f.role !== \"unset\" && !props[f.role]\n ),\n ];\n\n // We now get by-role grouping which is needed by the component.\n const roleConfigs = ensure(\n groupBy(mergedFieldsWithDefaults, (f) => f.role)\n );\n\n const finalRoles: Partial<Record<Role, EventsConfig[]>> = {};\n for (const role of roles) {\n if (role !== \"unset\") {\n finalRoles[role] = maybe(props[role], ensureArray) ?? roleConfigs[role];\n }\n }\n\n setControlContextData?.({\n ...data,\n mergedFields: mergedFieldsWithDefaults,\n minimalFullLengthFields: minimalFullLengthFieldsWithDefaults,\n });\n\n const normalized = mergedFieldsWithDefaults;\n return { normalized, finalRoles };\n }, [data, setControlContextData, props]);\n}\n","import dayjs, { Dayjs } from \"dayjs\";\nimport { roleProp } from \"../common-prop-types\";\nimport {\n isValidIsoDate,\n Registerable,\n registerComponentHelper,\n} from \"../utils\";\nimport { RichCalendar } from \"./RichCalendar\";\n\nexport * from \"./RichCalendar\";\n\nexport const calendarHelpers = {\n states: {\n mode: {\n onChangeArgsToValue: (_date: Dayjs, mode: string) => mode,\n },\n selectedDate: {\n onChangeArgsToValue: (date: Dayjs) => dayjs(date).toISOString(),\n },\n },\n};\n\nexport const calendarComponentName = \"hostless-rich-calendar\";\n\nexport function registerRichCalendar(loader?: Registerable) {\n registerComponentHelper(loader, RichCalendar, {\n name: calendarComponentName,\n displayName: \"Calendar\",\n props: {\n data: {\n type: \"dataSourceOpData\" as any,\n displayName: \"Events\",\n description:\n \"The events data should be a list of records with some date field.\",\n },\n title: roleProp({ role: \"title\" }),\n date: roleProp({ role: \"date\", singular: true }),\n color: roleProp({ role: \"color\", singular: true }),\n value: {\n // Must have a corresponding state and eventhandler for any prop that I want to be able to change in interactive mode.\n editOnly: true,\n uncontrolledProp: \"defaultValue\",\n type: \"dateString\",\n description: `The date selected by default as an ISO string`,\n validator: (value, ps) => {\n if (!ps.value) return true;\n if (!ps.validRange) return true;\n if (!isValidIsoDate(value)) return \"Not a valid ISO string.\";\n if (\n dayjs(value).isBefore(ps.validRange[0]) ||\n dayjs(value).isAfter(ps.validRange[1])\n )\n return \"Not within the valid range\";\n return true;\n },\n },\n mode: {\n type: \"choice\",\n options: [\"month\", \"year\"],\n description: \"The default display mode of the calendar.\",\n defaultValueHint: \"month\",\n },\n validRange: {\n type: \"dateRangeStrings\",\n description: \"Only allow selection of dates that lie within this range\",\n advanced: true,\n validator: (value, ps) => {\n if (!value) return true;\n if (!Array.isArray(value) || value.length !== 2)\n return \"Not an array with 2 items\";\n if (!isValidIsoDate(value[0]) || !isValidIsoDate(value[1]))\n return \"Min or max range is not in valid ISO date format.\";\n return true;\n },\n },\n headerRender: {\n type: \"slot\",\n renderPropParams: [\"headerProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Header\",\n },\n dateCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Date Cell\",\n },\n dateFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Date Cell\",\n },\n monthCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Append Month Cell\",\n },\n monthFullCellRender: {\n type: \"slot\",\n renderPropParams: [\"dateProps\"],\n hidePlaceholder: true,\n displayName: \"Custom Month Cell\",\n },\n onPanelChange: {\n type: \"eventHandler\",\n description:\n \"Triggers when the calendar mode changes (e.g. from month to year mode)\",\n argTypes: [\n { name: \"date\", type: \"object\" },\n { name: \"mode\", type: \"string\" },\n ],\n },\n onChange: {\n type: \"eventHandler\",\n argTypes: [{ name: \"date\", type: \"object\" }],\n },\n },\n states: {\n mode: {\n type: \"writable\",\n valueProp: \"mode\",\n onChangeProp: \"onPanelChange\",\n variableType: \"text\",\n ...calendarHelpers.states.mode,\n },\n selectedDate: {\n type: \"writable\",\n valueProp: \"value\",\n onChangeProp: \"onChange\",\n variableType: \"text\",\n ...calendarHelpers.states.selectedDate,\n },\n },\n componentHelpers: {\n helpers: calendarHelpers,\n importName: \"calendarHelpers\",\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n },\n importPath: \"@plasmicpkgs/plasmic-rich-components/skinny/rich-calendar\",\n importName: \"RichCalendar\",\n });\n}\n"],"names":["__spreadValues","_a"],"mappings":"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"}