or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

authentication.mdconfiguration.mdcore-operations.mdfield-types.mdglobal-operations.mdindex.mdpreferences.mdversion-control.md

preferences.mddocs/

0

# User Preferences System

1

2

User preferences system for storing and managing user-specific settings, UI state, and document preferences in Payload CMS. This system allows users to persist their preferences across sessions, including collapsed fields, admin panel settings, and custom application state.

3

4

## Capabilities

5

6

### Find Preference

7

8

Retrieves a user preference by key.

9

10

```typescript { .api }

11

/**

12

* Find a user preference by key

13

* @param options - Options for finding the preference

14

* @returns Promise resolving to the preference value or null

15

*/

16

function findPreference<T = any>(options: PreferenceRequest): Promise<T | null>;

17

18

interface PreferenceRequest {

19

/** The preference key to find */

20

key: string;

21

/** The user object */

22

user: User;

23

/** Express request object */

24

req: PayloadRequest;

25

/** Whether to override access control */

26

overrideAccess?: boolean;

27

}

28

```

29

30

**Usage Examples:**

31

32

```typescript

33

import payload from "payload";

34

35

// Find user's collapsed field preferences

36

const collapsedFields = await payload.findPreference({

37

key: "posts-fields",

38

user: req.user,

39

req,

40

});

41

42

// Find custom user settings

43

const dashboardSettings = await payload.findPreference({

44

key: "dashboard-layout",

45

user: req.user,

46

req,

47

});

48

```

49

50

### Update Preference

51

52

Updates or creates a user preference.

53

54

```typescript { .api }

55

/**

56

* Update or create a user preference

57

* @param options - Options for updating the preference

58

* @returns Promise resolving to the updated preference

59

*/

60

function updatePreference<T = any>(options: PreferenceUpdateRequest): Promise<Preference>;

61

62

interface PreferenceUpdateRequest extends PreferenceRequest {

63

/** The value to store for this preference */

64

value: T;

65

}

66

```

67

68

**Usage Examples:**

69

70

```typescript

71

import payload from "payload";

72

73

// Update collapsed field state

74

await payload.updatePreference({

75

key: "posts-fields",

76

value: {

77

fields: {

78

content: { collapsed: ["advancedOptions"] },

79

meta: { collapsed: ["seo", "social"] },

80

},

81

},

82

user: req.user,

83

req,

84

});

85

86

// Update custom settings

87

await payload.updatePreference({

88

key: "theme-preference",

89

value: { theme: "dark", sidebarCollapsed: true },

90

user: req.user,

91

req,

92

});

93

```

94

95

### Delete Preference

96

97

Deletes a user preference by key.

98

99

```typescript { .api }

100

/**

101

* Delete a user preference by key

102

* @param options - Options for deleting the preference

103

* @returns Promise resolving to the deleted preference or null

104

*/

105

function deletePreference(options: PreferenceRequest): Promise<Preference | null>;

106

```

107

108

**Usage Examples:**

109

110

```typescript

111

import payload from "payload";

112

113

// Reset user preferences

114

await payload.deletePreference({

115

key: "dashboard-layout",

116

user: req.user,

117

req,

118

});

119

```

120

121

## Types

122

123

```typescript { .api }

124

/**

125

* Base preference document structure

126

*/

127

interface Preference {

128

/** User ID that owns this preference */

129

user: string;

130

/** Collection slug the user belongs to */

131

userCollection: string;

132

/** Unique key for the preference */

133

key: string;

134

/** The stored preference value */

135

value: { [key: string]: unknown } | unknown;

136

/** Creation timestamp */

137

createdAt?: Date;

138

/** Last update timestamp */

139

updatedAt?: Date;

140

}

141

142

/**

143

* Document-level preferences for admin UI

144

*/

145

interface DocumentPreferences {

146

/** Field-specific preferences */

147

fields: FieldsPreferences;

148

}

149

150

/**

151

* Field preferences including collapse states

152

*/

153

interface FieldsPreferences {

154

[fieldName: string]: {

155

/** Array of collapsed field paths */

156

collapsed: CollapsedPreferences;

157

};

158

}

159

160

/**

161

* Array of field paths that are collapsed

162

*/

163

type CollapsedPreferences = string[];

164

```

165

166

## Common Use Cases

167

168

### Admin UI State Persistence

169

170

Preferences are commonly used to persist admin panel UI state across sessions:

171

172

```typescript

173

// Field collapse states

174

const fieldPrefs: DocumentPreferences = {

175

fields: {

176

content: {

177

collapsed: ["metadata", "seo"]

178

},

179

sidebar: {

180

collapsed: ["relatedPosts"]

181

},

182

},

183

};

184

185

await payload.updatePreference({

186

key: `${collection}-fields`,

187

value: fieldPrefs,

188

user: req.user,

189

req,

190

});

191

```

192

193

### Custom Application Settings

194

195

Store custom user settings for your application:

196

197

```typescript

198

// Theme and layout preferences

199

await payload.updatePreference({

200

key: "app-settings",

201

value: {

202

theme: "dark",

203

language: "en",

204

timezone: "America/New_York",

205

dashboardWidgets: ["analytics", "recent-posts"],

206

},

207

user: req.user,

208

req,

209

});

210

```

211

212

### Per-Collection Settings

213

214

Maintain different settings for each collection:

215

216

```typescript

217

// Different list view settings per collection

218

await payload.updatePreference({

219

key: "posts-list-view",

220

value: {

221

columns: ["title", "status", "author", "updatedAt"],

222

limit: 25,

223

sort: "-updatedAt",

224

},

225

user: req.user,

226

req,

227

});

228

229

await payload.updatePreference({

230

key: "media-list-view",

231

value: {

232

columns: ["filename", "alt", "filesize", "createdAt"],

233

limit: 50,

234

sort: "filename",

235

},

236

user: req.user,

237

req,

238

});

239

```