Skip to main content
Glama
views-schemas.ts7.61 kB
import { z } from 'zod'; // Base view types export const ViewTypeSchema = z.enum([ 'list', 'board', 'calendar', 'gantt', 'timeline', 'table', 'form', 'chat', 'workload', 'activity', 'map', 'embed' ]); // View access levels export const ViewAccessSchema = z.enum([ 'private', 'shared', 'public' ]); // Filter operators export const FilterOperatorSchema = z.enum([ 'equals', 'not_equals', 'contains', 'not_contains', 'starts_with', 'ends_with', 'is_empty', 'is_not_empty', 'greater_than', 'less_than', 'greater_than_or_equal', 'less_than_or_equal', 'between', 'not_between', 'in', 'not_in', 'is_set', 'is_not_set' ]); // View filter schema export const ViewFilterSchema = z.object({ field: z.string(), operator: FilterOperatorSchema, value: z.union([z.string(), z.number(), z.array(z.string()), z.array(z.number())]).optional(), values: z.array(z.union([z.string(), z.number()])).optional() }); // View grouping schema export const ViewGroupingSchema = z.object({ field: z.string(), collapsed: z.boolean().default(false), order: z.enum(['asc', 'desc']).default('asc') }); // View sorting schema export const ViewSortingSchema = z.object({ field: z.string(), order: z.enum(['asc', 'desc']).default('asc') }); // Board view specific settings export const BoardViewSettingsSchema = z.object({ columns: z.array(z.object({ id: z.string(), name: z.string(), color: z.string().optional(), orderindex: z.number().optional() })).optional(), swimlanes: z.object({ field: z.string(), collapsed: z.boolean().default(false) }).optional(), card_size: z.enum(['small', 'medium', 'large']).default('medium') }); // Calendar view specific settings export const CalendarViewSettingsSchema = z.object({ date_field: z.string(), view_mode: z.enum(['month', 'week', 'day']).default('month'), show_weekends: z.boolean().default(true), start_day: z.enum(['sunday', 'monday']).default('sunday') }); // Gantt view specific settings export const GanttViewSettingsSchema = z.object({ start_date_field: z.string(), due_date_field: z.string(), show_dependencies: z.boolean().default(true), show_critical_path: z.boolean().default(false), zoom_level: z.enum(['hours', 'days', 'weeks', 'months']).default('days') }); // Table view specific settings export const TableViewSettingsSchema = z.object({ columns: z.array(z.object({ field: z.string(), width: z.number().optional(), visible: z.boolean().default(true), orderindex: z.number().optional() })), row_height: z.enum(['compact', 'comfortable', 'spacious']).default('comfortable') }); // View settings union export const ViewSettingsSchema = z.union([ BoardViewSettingsSchema, CalendarViewSettingsSchema, GanttViewSettingsSchema, TableViewSettingsSchema, z.object({}) // For other view types without specific settings ]); // Create view schema export const CreateViewSchema = z.object({ parent_id: z.string(), parent_type: z.enum(['space', 'folder', 'list']), name: z.string().min(1), type: ViewTypeSchema, access: ViewAccessSchema.default('private'), filters: z.array(ViewFilterSchema).optional(), grouping: z.array(ViewGroupingSchema).optional(), sorting: z.array(ViewSortingSchema).optional(), settings: ViewSettingsSchema.optional(), description: z.string().optional() }); // Update view schema export const UpdateViewSchema = z.object({ view_id: z.string(), name: z.string().optional(), access: ViewAccessSchema.optional(), filters: z.array(ViewFilterSchema).optional(), grouping: z.array(ViewGroupingSchema).optional(), sorting: z.array(ViewSortingSchema).optional(), settings: ViewSettingsSchema.optional(), description: z.string().optional() }); // Get views filter schema export const GetViewsFilterSchema = z.object({ parent_id: z.string(), parent_type: z.enum(['space', 'folder', 'list']), type: ViewTypeSchema.optional(), access: ViewAccessSchema.optional() }); // Set view filters schema export const SetViewFiltersSchema = z.object({ view_id: z.string(), filters: z.array(ViewFilterSchema) }); // Set view grouping schema export const SetViewGroupingSchema = z.object({ view_id: z.string(), grouping: z.array(ViewGroupingSchema) }); // Set view sorting schema export const SetViewSortingSchema = z.object({ view_id: z.string(), sorting: z.array(ViewSortingSchema) }); // Update view settings schema export const UpdateViewSettingsSchema = z.object({ view_id: z.string(), settings: ViewSettingsSchema }); // View sharing schema export const ViewSharingSchema = z.object({ view_id: z.string(), access: ViewAccessSchema, password: z.string().optional(), expires_at: z.number().optional() // Unix timestamp }); // Type exports export type ViewType = z.infer<typeof ViewTypeSchema>; export type ViewAccess = z.infer<typeof ViewAccessSchema>; export type FilterOperator = z.infer<typeof FilterOperatorSchema>; export type ViewFilter = z.infer<typeof ViewFilterSchema>; export type ViewGrouping = z.infer<typeof ViewGroupingSchema>; export type ViewSorting = z.infer<typeof ViewSortingSchema>; export type BoardViewSettings = z.infer<typeof BoardViewSettingsSchema>; export type CalendarViewSettings = z.infer<typeof CalendarViewSettingsSchema>; export type GanttViewSettings = z.infer<typeof GanttViewSettingsSchema>; export type TableViewSettings = z.infer<typeof TableViewSettingsSchema>; export type ViewSettings = z.infer<typeof ViewSettingsSchema>; export type CreateViewRequest = z.infer<typeof CreateViewSchema>; export type UpdateViewRequest = z.infer<typeof UpdateViewSchema>; export type GetViewsFilter = z.infer<typeof GetViewsFilterSchema>; export type SetViewFiltersRequest = z.infer<typeof SetViewFiltersSchema>; export type SetViewGroupingRequest = z.infer<typeof SetViewGroupingSchema>; export type SetViewSortingRequest = z.infer<typeof SetViewSortingSchema>; export type UpdateViewSettingsRequest = z.infer<typeof UpdateViewSettingsSchema>; export type ViewSharingRequest = z.infer<typeof ViewSharingSchema>; // Utility functions export const createDefaultBoardSettings = (): BoardViewSettings => ({ card_size: 'medium' }); export const createDefaultCalendarSettings = (dateField: string): CalendarViewSettings => ({ date_field: dateField, view_mode: 'month', show_weekends: true, start_day: 'sunday' }); export const createDefaultGanttSettings = (startField: string, dueField: string): GanttViewSettings => ({ start_date_field: startField, due_date_field: dueField, show_dependencies: true, show_critical_path: false, zoom_level: 'days' }); export const createDefaultTableSettings = (fields: string[]): TableViewSettings => ({ columns: fields.map((field, index) => ({ field, visible: true, orderindex: index })), row_height: 'comfortable' }); // Filter validation helpers export const validateFilterValue = (operator: FilterOperator, value: any): boolean => { switch (operator) { case 'between': case 'not_between': return Array.isArray(value) && value.length === 2; case 'in': case 'not_in': return Array.isArray(value); case 'is_empty': case 'is_not_empty': case 'is_set': case 'is_not_set': return value === undefined; default: return value !== undefined; } }; export const getRequiredFilterFields = (viewType: ViewType): string[] => { switch (viewType) { case 'calendar': return ['date_field']; case 'gantt': case 'timeline': return ['start_date_field', 'due_date_field']; default: return []; } };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Chykalophia/ClickUp-MCP-Server---Enhanced'

If you have feedback or need assistance with the MCP directory API, please join our Discord server