PluginProbe
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration / 2.2.1
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration v2.2.1
2.2.1 2.2.0 2.1.0 2.0.15 2.0.12 2.0.10 2.0.4 2.0.1 2.0.0 1.95.3 1.95.2 1.95 1.91.6 trunk 1.11 1.12 1.13 1.20 1.21 1.22 1.23 1.30 1.31 1.32 1.35 All 44 releases
← All changes | app/Services/Constant.php +202 -35 1.20 → 2.2.1 View file →
@@ -4,8 +4,23 @@
4 4
5 5
6 6 class Constant{
7 7
8 + const USER_PROFILE_PHOTO = 'fbs_profile_photo';
9 + const USER_PROFILE_PHOTO_UPLOAD = '_fbs_profile_photo_upload';
10 + const PROFILE_PHOTO_MAX_DIMENSION = 4096;
11 + const PROFILE_PHOTO_MAX_PIXELS = 12000000;
12 + const PROFILE_AVATAR_SIZE = 256;
13 +
14 + const PROFILE_DISPLAY_NAME_MAX_LENGTH = 250;
15 + const PROFILE_PHOTO_META_KEY = 'fbs_profile_photo';
16 + const PROFILE_PHOTO_MAX_BYTES = 2 * 1024 * 1024;
17 +
18 + const UPLOAD_PROTECTION_CHECK_PREFIX = '_fbs_upload_protection_';
19 + const FLUENT_BOARDS_IMPORT = 'FluentBoards';
20 + const JSON_IMPORT = 'json_import';
21 + const TASK_ESTIMATED_MINUTES = '_estimated_minutes';
22 +
8 23 const BOARD_EMAIL_COMMENT = 'email_after_comment';
9 24 const BOARD_EMAIL_TASK_ASSIGN = 'email_after_task_assign';
10 25 const BOARD_EMAIL_STAGE_CHANGE = 'email_after_task_stage_change';
11 26
@@ -18,8 +33,9 @@
18 33 const ACTIVITY_TASK = 'task_activity';
19 34 const ACTIVITY_BOARD = 'board_activity';
20 35
21 36 const TASK_ASSIGNEE = 'task_assignee';
37 + const TASK_SOURCE_FLUENT_SUPPORT = 'FluentSupport';
22 38
23 39 const OBJECT_TYPE_BOARD_USER_EMAIL_NOTIFICATION = 'board_user_email';
24 40 const OBJECT_TYPE_BOARD_USER_NOTIFICATION = 'board_user_notification';
25 41 const OBJECT_TYPE_TASK_ASSIGNEE = 'task_assignee';
@@ -30,9 +46,8 @@
30 46
31 47 const TASK_WATCH_NOTIFICATION_TYPES = [
32 48 'comment_add' => true,
33 49 'comment_update' => true,
34 - 'description_update' => true,
35 50 'title_change' => true,
36 51 'move_to_another_board' => true,
37 52 'Label' => true,
38 53 'due_at' => true,
@@ -54,13 +69,20 @@
54 69 const OBJECT_TYPE_BOARD_NOTIFICATION = 'board_notification';
55 70
56 71 const OBJECT_TYPE_USER_TASK_WATCH = 'task_user_watch';
57 72
73 + const OBJECT_TYPE_TASK_DEPENDENCY = 'task_dependency';
74 +
58 75 const IS_TASK_TEMPLATE = 'is_template';
76 + const IS_TASK_PINNED = 'is_pinned';
59 77
60 78 const BOARD_USER_SETTINGS = [
61 79 'is_admin' => false
62 80 ];
81 + const BOARD_USER_VIEWER_ONLY_SETTINGS = [
82 + 'is_admin' => false,
83 + 'is_viewer_only' => true
84 + ];
63 85
64 86 const FLUENT_BOARD_ADMIN = 'fluent_board_admin';
65 87
66 88 const IS_BOARD_ADMIN = 'is_admin';
@@ -68,8 +90,11 @@
68 90 const USER_RECENT_BOARDS = 'user_recent_boards';
69 91 const USER_GLOBAL_NOTIFICATIONS = 'user_global_notifications';
70 92
71 93 const OBJECT_TYPE_BOARD = 'board';
94 +
95 + const OBJECT_TYPE_FOLDER = 'folder';
96 + const OBJECT_TYPE_FOLDER_BOARD = 'FluentBoardsPro\App\Models\Folder';
72 97 const OBJECT_TYPE_TASK = 'TASK';
73 98 const CRM_CONTACT = 'crm_subscriber';
74 99 const CRM_CONTACT_ASSOCIATED_BOARD = 'contact_associated_board';
75 100 const BOARD_ASSOCIATED_CRM_CONTACT = 'board_associated_contact';
@@ -81,16 +106,39 @@
81 106 const GLOBAL_EMAIL_NOTIFICATION_STAGE_CHANGE = 'email_after_task_stage_change';
82 107 const GLOBAL_EMAIL_NOTIFICATION_DUE_DATE = 'email_after_task_due_date_change';
83 108 const GLOBAL_EMAIL_NOTIFICATION_REMOVE_FROM_TASK = 'email_after_remove_from_task';
84 109 const GLOBAL_EMAIL_NOTIFICATION_TASK_ARCHIVE = 'email_after_task_archive';
110 + const GLOBAL_EMAIL_NOTIFICATION_CREATING_TASK = 'watch_on_creating_task';
111 + const GLOBAL_EMAIL_NOTIFICATION_COMMENTING = 'watch_on_commenting';
112 + const GLOBAL_EMAIL_NOTIFICATION_ASSIGNING= 'watch_on_assigning';
85 113 const GLOBAL_DASHBOARD_NOTIFICATION = 'dashboard_notification';
86 114
87 115 const USER_DASHBOARD_VIEW = 'user_dashboard_view';
88 116
117 + const USER_LISTVIEW_PREFERENCES = 'user_listview_preferences';
118 + const USER_TABLEVIEW_PREFERENCES = 'user_tableview_preferences';
89 119
90 - const BOARD_DEFAULT_IMAGE = 'board_default_image';
91 - const BOARD_DEFAULT_IMAGE_URL = 'https://fluentboards.com/shared-files/';
120 + const DEFAULT_DASHBOARD_VIEW_PREFERENCES = [
121 + 'dashboard_view_label' => true,
122 + 'dashboard_view_priority' => true,
123 + 'dashboard_view_assignee' => true,
124 + 'dashboard_view_subtask' => true,
125 + 'dashboard_view_attachment' => true,
126 + 'dashboard_view_due_date' => true,
127 + 'dashboard_view_comment' => true,
128 + 'dashboard_view_notification' => true
129 + ];
92 130
131 + const DEFAULT_TABLEVIEW_VIEW_PREFERENCES = [
132 + 'table_view_priority' => true,
133 + 'table_view_status' => true,
134 + 'table_view_dates' => true,
135 + 'table_view_assignees' => true,
136 + 'table_view_labels' => true,
137 + 'table_view_created_at' => true,
138 + 'table_view_subtasks' => false,
139 + 'table_view_activity' => false,
140 + ];
93 141
94 142 const TRELLO_COLOR_MAP = [
95 143 "green" => "#4bce97",
96 144 "yellow" => "#f5cd47",
@@ -156,102 +204,180 @@
156 204 "pink_light" => "#1B2533",
157 205 "black_light" => "#1B2533"
158 206 ];
159 207
208 + const LABEL_COLOR_PRESET_SETTING = 'color_preset';
209 +
210 + /**
211 + * Theme-aware label colors in the same order shown by the label picker.
212 + *
213 + * The persisted preset ID is stable; the UI selects the light or dark
214 + * pair at render time. The light pair is also stored as a compatibility
215 + * fallback for integrations and older clients.
216 + */
217 + const LABEL_COLOR_PRESETS = [
218 + ['id' => 'green-soft', 'light_bg_color' => '#C1EED9', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#234030', 'dark_text_color' => '#FFFFFF'],
219 + ['id' => 'yellow-soft', 'light_bg_color' => '#F1E593', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#463817', 'dark_text_color' => '#FFFFFF'],
220 + ['id' => 'orange-soft', 'light_bg_color' => '#F7E0A8', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#562F15', 'dark_text_color' => '#FFFFFF'],
221 + ['id' => 'red-soft', 'light_bg_color' => '#F6D2CE', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#4B211D', 'dark_text_color' => '#FFFFFF'],
222 + ['id' => 'purple-soft', 'light_bg_color' => '#E6D3F7', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#3A234F', 'dark_text_color' => '#FFFFFF'],
223 + ['id' => 'green-bold', 'light_bg_color' => '#70C392', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#366048', 'dark_text_color' => '#FFFFFF'],
224 + ['id' => 'yellow-bold', 'light_bg_color' => '#E4CA59', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#6F5523', 'dark_text_color' => '#FFFFFF'],
225 + ['id' => 'orange-bold', 'light_bg_color' => '#EBA146', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#874922', 'dark_text_color' => '#FFFFFF'],
226 + ['id' => 'red-bold', 'light_bg_color' => '#E17066', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#95362D', 'dark_text_color' => '#FFFFFF'],
227 + ['id' => 'purple-bold', 'light_bg_color' => '#B579E7', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#6B3E92', 'dark_text_color' => '#FFFFFF'],
228 + ['id' => 'green-strong', 'light_bg_color' => '#3F7654', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#70C392', 'dark_text_color' => '#1B2533'],
229 + ['id' => 'yellow-strong', 'light_bg_color' => '#826429', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#CFAA47', 'dark_text_color' => '#1B2533'],
230 + ['id' => 'orange-strong', 'light_bg_color' => '#A6572A', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#EBA146', 'dark_text_color' => '#1B2533'],
231 + ['id' => 'red-strong', 'light_bg_color' => '#AF4035', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#E17066', 'dark_text_color' => '#1B2533'],
232 + ['id' => 'purple-strong', 'light_bg_color' => '#8049AE', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#B579E7', 'dark_text_color' => '#1B2533'],
233 + ['id' => 'blue-soft', 'light_bg_color' => '#CCDDF9', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#1A2D53', 'dark_text_color' => '#FFFFFF'],
234 + ['id' => 'sky-soft', 'light_bg_color' => '#C9E8F7', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#223B49', 'dark_text_color' => '#FFFFFF'],
235 + ['id' => 'lime-soft', 'light_bg_color' => '#D5ECAA', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#333E22', 'dark_text_color' => '#FFFFFF'],
236 + ['id' => 'pink-soft', 'light_bg_color' => '#F4CDE6', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#402436', 'dark_text_color' => '#FFFFFF'],
237 + ['id' => 'gray-soft', 'light_bg_color' => '#D8D9DC', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#424446', 'dark_text_color' => '#FFFFFF'],
238 + ['id' => 'blue-bold', 'light_bg_color' => '#6A93E3', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#294FA9', 'dark_text_color' => '#FFFFFF'],
239 + ['id' => 'sky-bold', 'light_bg_color' => '#7BB9D6', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#345E73', 'dark_text_color' => '#FFFFFF'],
240 + ['id' => 'lime-bold', 'light_bg_color' => '#97BD5C', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#4A5F2B', 'dark_text_color' => '#FFFFFF'],
241 + ['id' => 'pink-bold', 'light_bg_color' => '#D172AE', 'light_text_color' => '#1B2533', 'dark_bg_color' => '#7D3D65', 'dark_text_color' => '#FFFFFF'],
242 + ['id' => 'gray-bold', 'light_bg_color' => '#81848B', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#595B60', 'dark_text_color' => '#FFFFFF'],
243 + ['id' => 'blue-strong', 'light_bg_color' => '#305FCA', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#6A93E3', 'dark_text_color' => '#1B2533'],
244 + ['id' => 'sky-strong', 'light_bg_color' => '#3D708B', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#7BB9D6', 'dark_text_color' => '#1B2533'],
245 + ['id' => 'lime-strong', 'light_bg_color' => '#5A7133', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#97BD5C', 'dark_text_color' => '#1B2533'],
246 + ['id' => 'pink-strong', 'light_bg_color' => '#964878', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#D172AE', 'dark_text_color' => '#1B2533'],
247 + ['id' => 'gray-strong', 'light_bg_color' => '#60636A', 'light_text_color' => '#FFFFFF', 'dark_bg_color' => '#8B8E93', 'dark_text_color' => '#1B2533'],
248 + ];
249 +
250 + /**
251 + * Find a predefined label color by its persisted ID.
252 + *
253 + * @param string $presetId
254 + * @return array|null
255 + */
256 + public static function getLabelColorPreset($presetId)
257 + {
258 + foreach (self::LABEL_COLOR_PRESETS as $preset) {
259 + if ($preset['id'] === $presetId) {
260 + return $preset;
261 + }
262 + }
263 +
264 + return null;
265 + }
266 +
267 +
160 268 const FBS_ONBOARDING = 'fbs_onboarding';
161 269 const FBS_RECENTLY_VIEWED_CHECK = 'fbs_recently_viewed_checked';
162 270 const BOARD_BACKGROUND_DEFAULT_SOLID_COLORS = [
163 271 [
164 272 'id' => 'solid_1',
165 - 'value' => '#d1d8e0'
273 + 'value' => '#6A88A7',
274 + 'dark_value' => '#314253'
166 275 ],
167 276 [
168 277 'id' => 'solid_2',
169 - 'value' => '#ff9ff3'
278 + 'value' => '#9E7D61',
279 + 'dark_value' => '#574435'
170 280 ],
171 281 [
172 282 'id' => 'solid_3',
173 - 'value' => '#a55eea'
283 + 'value' => '#D24F7D',
284 + 'dark_value' => '#6A223C'
174 285 ],
175 286 [
176 287 'id' => 'solid_4',
177 - 'value' => '#5f27cd'
288 + 'value' => '#D7543D',
289 + 'dark_value' => '#772E21'
178 290 ],
179 291 [
180 292 'id' => 'solid_5',
181 - 'value' => '#706fd3'
293 + 'value' => '#B17720',
294 + 'dark_value' => '#614113'
182 295 ],
183 296 [
184 297 'id' => 'solid_6',
185 - 'value' => '#4b7bec'
298 + 'value' => '#8C8920',
299 + 'dark_value' => '#44420F'
186 300 ],
187 301 [
188 302 'id' => 'solid_7',
189 - 'value' => '#4640FB'
303 + 'value' => '#429B3A',
304 + 'dark_value' => '#1B4C17'
190 305 ],
191 306 [
192 307 'id' => 'solid_8',
193 - 'value' => '#474787'
308 + 'value' => '#259A77',
309 + 'dark_value' => '#114B39'
194 310 ],
195 311 [
196 312 'id' => 'solid_9',
197 - 'value' => '#3F1770'
313 + 'value' => '#259697',
314 + 'dark_value' => '#114949'
198 315 ],
199 316 [
200 317 'id' => 'solid_10',
201 - 'value' => '#182C61'
318 + 'value' => '#2491B6',
319 + 'dark_value' => '#114659'
202 320 ],
203 321 [
204 322 'id' => 'solid_11',
205 - 'value' => '#1B1464'
323 + 'value' => '#2682F1',
324 + 'dark_value' => '#0F3F79'
206 325 ],
207 326 [
208 327 'id' => 'solid_12',
209 - 'value' => '#2f3640'
328 + 'value' => '#7F6DEE',
329 + 'dark_value' => '#3D3379'
210 330 ],
211 331 [
212 332 'id' => 'solid_13',
213 - 'value' => '#043D4A'
333 + 'value' => '#A85ED1',
334 + 'dark_value' => '#532B6A'
214 335 ],
215 336 [
216 337 'id' => 'solid_14',
217 - 'value' => '#009432'
338 + 'value' => '#C156AB',
339 + 'dark_value' => '#612655'
218 340 ],
219 341 [
220 342 'id' => 'solid_15',
221 - 'value' => '#10ac84'
343 + 'value' => '#FB98EE',
344 + 'dark_value' => '#673361'
222 345 ],
223 346 [
224 347 'id' => 'solid_16',
225 - 'value' => '#ffc048'
348 + 'value' => '#522BC1',
349 + 'dark_value' => '#352678'
226 350 ],
227 351 [
228 352 'id' => 'solid_17',
229 - 'value' => '#ffb142'
353 + 'value' => '#3C40F3',
354 + 'dark_value' => '#222A8C'
230 355 ],
231 356 [
232 357 'id' => 'solid_18',
233 - 'value' => '#F48D45'
358 + 'value' => '#FCB84E',
359 + 'dark_value' => '#6D4C14'
234 360 ],
235 361 [
236 362 'id' => 'solid_19',
237 - 'value' => '#EF6A64'
363 + 'value' => '#FCA848',
364 + 'dark_value' => '#714714'
238 365 ],
239 366 [
240 367 'id' => 'solid_20',
241 - 'value' => '#ff5252'
368 + 'value' => '#EF8346',
369 + 'dark_value' => '#763B19'
242 370 ],
243 371 [
244 372 'id' => 'solid_21',
245 - 'value' => '#c23616'
373 + 'value' => '#B63220',
374 + 'dark_value' => '#681D22'
246 375 ],
247 376 [
248 377 'id' => 'solid_22',
249 - 'value' => 'hsla(238, 100%, 71%, 1)'
250 - ],
251 - [
252 - 'id' => 'solid_23',
253 - 'value' => 'hsla(171, 87%, 67%, 1)'
378 + 'value' => '#63F1D9',
379 + 'dark_value' => '#15584E'
254 380 ]
255 381 ];
256 382
257 383 const BOARD_BACKGROUND_DEFAULT_GRADIENT_COLORS = [
@@ -256,33 +382,74 @@
256 382
257 383 const BOARD_BACKGROUND_DEFAULT_GRADIENT_COLORS = [
258 384 [
259 385 'id' => 'gradient_1',
260 - 'value' => 'linear-gradient(111.53deg, #4A9B7F 2%, #0A3431 100%)',
386 + 'value' => 'linear-gradient(145deg, #479176 0%, #0F2C2B 100%)',
387 + 'dark_value' => 'linear-gradient(145deg, #156A4F 0%, #0D302F 100%)',
261 388 ],
262 389 [
263 390 'id' => 'gradient_2',
264 - 'value' => 'linear-gradient(135deg, #B57BEE -2.09%, #392D69 100%)',
391 + 'value' => 'linear-gradient(145deg, #A470E1 0%, #2E2758 100%)',
392 + 'dark_value' => 'linear-gradient(145deg, #7637B7 0%, #2A2650 100%)',
265 393 ],
266 394 [
267 395 'id' => 'gradient_3',
268 - 'value' => 'linear-gradient(111.53deg, #FD792F 0%, #F83D5C 98%)',
396 + 'value' => 'linear-gradient(145deg, #F86E35 0%, #F13855 98%)',
397 + 'dark_value' => 'linear-gradient(145deg, #9F3A13 0%, #580A18 98%)',
269 398 ],
270 399 [
271 400 'id' => 'gradient_4',
272 - 'value' => 'linear-gradient(140.25deg, #0968E5 0.02%, #020344 100%)',
401 + 'value' => 'linear-gradient(145deg, #145CD7 0%, #050634 100%)',
402 + 'dark_value' => 'linear-gradient(145deg, #1858B4 0%, #242155 100%)',
273 403 ],
274 404 [
275 405 'id' => 'gradient_5',
276 - 'value' => 'linear-gradient(90deg, hsla(238, 100%, 71%, 1) 0%, hsla(295, 100%, 84%, 1) 100%)',
406 + 'value' => 'linear-gradient(145deg, #5E69F9 0%, #F3A6FB 100%)',
407 + 'dark_value' => 'linear-gradient(145deg, #423EA7 0%, #4B1D50 100%)',
277 408 ],
278 409 [
279 410 'id' => 'gradient_6',
280 - 'value' => 'linear-gradient(90deg, hsla(171, 87%, 67%, 1) 0%, hsla(236, 100%, 72%, 1) 100%)',
411 + 'value' => 'linear-gradient(145deg, #62EED9 0%, #646FF9 100%)',
412 + 'dark_value' => 'linear-gradient(145deg, #187767 0%, #2A2660 100%)',
281 413 ]
282 414 ];
283 415
284 416 const ACTIVITY_ACTION_CREATED = 'created';
285 417 const ACTIVITY_ACTION_UPDATED = 'updated';
418 + const ACTIVITY_ACTION_ADDED = 'added';
419 + const ACTIVITY_ACTION_CHANGED = 'changed';
420 + const ACTIVITY_ACTION_REMOVED = 'removed';
421 + const ACTIVITY_CUSTOM_FIELD = 'custom field';
286 422 const ACTIVITY_ACTION_DELETED = 'deleted';
287 423
424 + const TASK_ATTACHMENT = 'TASK';
425 +
426 + const TASK_DESCRIPTION = 'task_description';
427 +
428 + const COMMENT_IMAGE = 'comment_image';
429 +
430 + const ATTACHMENT_UPLOAD_BOARD_ID = 'upload_board_id';
431 + const ATTACHMENT_UPLOAD_USER_ID = 'upload_user_id';
432 + const ATTACHMENT_LEGACY_SIGNATURE_QUERY_KEY = 'secure_sign';
433 + const ATTACHMENT_LEGACY_EXPIRES_QUERY_KEY = 'secure_expires';
434 +
435 + const REPEAT_TASK_META = 'repeat_task';
436 +
437 + const BOARD_TERM_CUSTOM_FIELD = 'custom-field';
438 + const TASK_CUSTOM_FIELD = 'task_custom_field';
439 +
440 + const BOARD_CSV_EXPORT = 'csv_export';
441 + const BOARD_JSON_EXPORT = 'json_export';
442 + const BOARD_ATTACHMENT = 'BOARD';
443 +
444 + const BOARD_BACKGROUND_IMAGE = 'board_background_image';
445 + const FBS_TASK_TABS_CONFIG = "fbs_task_tabs_config";
446 +
447 + const FBS_OLD_SUBTASK_SYNC = 'fbs_old_subtask_sync';
448 +
449 + const SUBTASK_GROUP_NAME = 'group_name';
450 + const SUBTASK_GROUP_CHILD = 'subtask_group_id';
451 +
452 + const USER_PINNED_BOARDS = 'pinned_boards';
453 +
454 + const META_KEY_ARCHIVED_BY_STAGE = 'archived_by_stage';
288 455 }