PluginProbe
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration / 2.2.0
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration v2.2.0
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 1.40 All 43 releases
← All changes | app/Services/Constant.php +144 -33 1.95.3 → 2.2.0 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,
@@ -77,8 +92,9 @@
77 92
78 93 const OBJECT_TYPE_BOARD = 'board';
79 94
80 95 const OBJECT_TYPE_FOLDER = 'folder';
96 + const OBJECT_TYPE_FOLDER_BOARD = 'FluentBoardsPro\App\Models\Folder';
81 97 const OBJECT_TYPE_TASK = 'TASK';
82 98 const CRM_CONTACT = 'crm_subscriber';
83 99 const CRM_CONTACT_ASSOCIATED_BOARD = 'contact_associated_board';
84 100 const BOARD_ASSOCIATED_CRM_CONTACT = 'board_associated_contact';
@@ -118,8 +134,10 @@
118 134 'table_view_dates' => true,
119 135 'table_view_assignees' => true,
120 136 'table_view_labels' => true,
121 137 'table_view_created_at' => true,
138 + 'table_view_subtasks' => false,
139 + 'table_view_activity' => false,
122 140 ];
123 141
124 142 const TRELLO_COLOR_MAP = [
125 143 "green" => "#4bce97",
@@ -186,103 +204,180 @@
186 204 "pink_light" => "#1B2533",
187 205 "black_light" => "#1B2533"
188 206 ];
189 207
208 + const LABEL_COLOR_PRESET_SETTING = 'color_preset';
190 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 +
191 268 const FBS_ONBOARDING = 'fbs_onboarding';
192 269 const FBS_RECENTLY_VIEWED_CHECK = 'fbs_recently_viewed_checked';
193 270 const BOARD_BACKGROUND_DEFAULT_SOLID_COLORS = [
194 271 [
195 272 'id' => 'solid_1',
196 - 'value' => '#d1d8e0'
273 + 'value' => '#6A88A7',
274 + 'dark_value' => '#314253'
197 275 ],
198 276 [
199 277 'id' => 'solid_2',
200 - 'value' => '#ff9ff3'
278 + 'value' => '#9E7D61',
279 + 'dark_value' => '#574435'
201 280 ],
202 281 [
203 282 'id' => 'solid_3',
204 - 'value' => '#a55eea'
283 + 'value' => '#D24F7D',
284 + 'dark_value' => '#6A223C'
205 285 ],
206 286 [
207 287 'id' => 'solid_4',
208 - 'value' => '#5f27cd'
288 + 'value' => '#D7543D',
289 + 'dark_value' => '#772E21'
209 290 ],
210 291 [
211 292 'id' => 'solid_5',
212 - 'value' => '#706fd3'
293 + 'value' => '#B17720',
294 + 'dark_value' => '#614113'
213 295 ],
214 296 [
215 297 'id' => 'solid_6',
216 - 'value' => '#4b7bec'
298 + 'value' => '#8C8920',
299 + 'dark_value' => '#44420F'
217 300 ],
218 301 [
219 302 'id' => 'solid_7',
220 - 'value' => '#4640FB'
303 + 'value' => '#429B3A',
304 + 'dark_value' => '#1B4C17'
221 305 ],
222 306 [
223 307 'id' => 'solid_8',
224 - 'value' => '#474787'
308 + 'value' => '#259A77',
309 + 'dark_value' => '#114B39'
225 310 ],
226 311 [
227 312 'id' => 'solid_9',
228 - 'value' => '#3F1770'
313 + 'value' => '#259697',
314 + 'dark_value' => '#114949'
229 315 ],
230 316 [
231 317 'id' => 'solid_10',
232 - 'value' => '#182C61'
318 + 'value' => '#2491B6',
319 + 'dark_value' => '#114659'
233 320 ],
234 321 [
235 322 'id' => 'solid_11',
236 - 'value' => '#1B1464'
323 + 'value' => '#2682F1',
324 + 'dark_value' => '#0F3F79'
237 325 ],
238 326 [
239 327 'id' => 'solid_12',
240 - 'value' => '#2f3640'
328 + 'value' => '#7F6DEE',
329 + 'dark_value' => '#3D3379'
241 330 ],
242 331 [
243 332 'id' => 'solid_13',
244 - 'value' => '#043D4A'
333 + 'value' => '#A85ED1',
334 + 'dark_value' => '#532B6A'
245 335 ],
246 336 [
247 337 'id' => 'solid_14',
248 - 'value' => '#009432'
338 + 'value' => '#C156AB',
339 + 'dark_value' => '#612655'
249 340 ],
250 341 [
251 342 'id' => 'solid_15',
252 - 'value' => '#10ac84'
343 + 'value' => '#FB98EE',
344 + 'dark_value' => '#673361'
253 345 ],
254 346 [
255 347 'id' => 'solid_16',
256 - 'value' => '#ffc048'
348 + 'value' => '#522BC1',
349 + 'dark_value' => '#352678'
257 350 ],
258 351 [
259 352 'id' => 'solid_17',
260 - 'value' => '#ffb142'
353 + 'value' => '#3C40F3',
354 + 'dark_value' => '#222A8C'
261 355 ],
262 356 [
263 357 'id' => 'solid_18',
264 - 'value' => '#F48D45'
358 + 'value' => '#FCB84E',
359 + 'dark_value' => '#6D4C14'
265 360 ],
266 361 [
267 362 'id' => 'solid_19',
268 - 'value' => '#EF6A64'
363 + 'value' => '#FCA848',
364 + 'dark_value' => '#714714'
269 365 ],
270 366 [
271 367 'id' => 'solid_20',
272 - 'value' => '#ff5252'
368 + 'value' => '#EF8346',
369 + 'dark_value' => '#763B19'
273 370 ],
274 371 [
275 372 'id' => 'solid_21',
276 - 'value' => '#c23616'
373 + 'value' => '#B63220',
374 + 'dark_value' => '#681D22'
277 375 ],
278 376 [
279 377 'id' => 'solid_22',
280 - 'value' => 'hsla(238, 100%, 71%, 1)'
281 - ],
282 - [
283 - 'id' => 'solid_23',
284 - 'value' => 'hsla(171, 87%, 67%, 1)'
378 + 'value' => '#63F1D9',
379 + 'dark_value' => '#15584E'
285 380 ]
286 381 ];
287 382
288 383 const BOARD_BACKGROUND_DEFAULT_GRADIENT_COLORS = [
@@ -287,34 +382,44 @@
287 382
288 383 const BOARD_BACKGROUND_DEFAULT_GRADIENT_COLORS = [
289 384 [
290 385 'id' => 'gradient_1',
291 - '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%)',
292 388 ],
293 389 [
294 390 'id' => 'gradient_2',
295 - '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%)',
296 393 ],
297 394 [
298 395 'id' => 'gradient_3',
299 - '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%)',
300 398 ],
301 399 [
302 400 'id' => 'gradient_4',
303 - '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%)',
304 403 ],
305 404 [
306 405 'id' => 'gradient_5',
307 - '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%)',
308 408 ],
309 409 [
310 410 'id' => 'gradient_6',
311 - '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%)',
312 413 ]
313 414 ];
314 415
315 416 const ACTIVITY_ACTION_CREATED = 'created';
316 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';
317 422 const ACTIVITY_ACTION_DELETED = 'deleted';
318 423
319 424 const TASK_ATTACHMENT = 'TASK';
320 425
@@ -321,10 +426,16 @@
321 426 const TASK_DESCRIPTION = 'task_description';
322 427
323 428 const COMMENT_IMAGE = 'comment_image';
324 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 +
325 435 const REPEAT_TASK_META = 'repeat_task';
326 436
437 + const BOARD_TERM_CUSTOM_FIELD = 'custom-field';
327 438 const TASK_CUSTOM_FIELD = 'task_custom_field';
328 439
329 440 const BOARD_CSV_EXPORT = 'csv_export';
330 441 const BOARD_JSON_EXPORT = 'json_export';