diff --git a/twake/backend/core/src/Twake/Channels/Controller/ChannelsNotifications.php b/twake/backend/core/src/Twake/Channels/Controller/ChannelsNotifications.php index e3391a4296..baf0d1c4fa 100755 --- a/twake/backend/core/src/Twake/Channels/Controller/ChannelsNotifications.php +++ b/twake/backend/core/src/Twake/Channels/Controller/ChannelsNotifications.php @@ -12,7 +12,10 @@ class ChannelsNotifications extends BaseController public function mute(Request $request) { $channel_id = $request->request->get("channel_id"); - $mute = $request->request->get("mute", true); + $mute = $request->request->get("mute", 1); + if(!is_integer($mute)){ + $mute = $mute?2:0; + } $res = $this->get("app.channels.notifications")->mute($channel_id, $mute, $this->getUser()); if (!$res) { return new Response(Array("status" => "error")); diff --git a/twake/backend/core/src/Twake/Channels/Entity/ChannelMember.php b/twake/backend/core/src/Twake/Channels/Entity/ChannelMember.php index 8bf224f7dd..a7e9956ac0 100755 --- a/twake/backend/core/src/Twake/Channels/Entity/ChannelMember.php +++ b/twake/backend/core/src/Twake/Channels/Entity/ChannelMember.php @@ -64,7 +64,7 @@ class ChannelMember private $last_access = 0; /** - * @ORM\Column(name="muted", type="twake_boolean") + * @ORM\Column(name="muted", type="tinyint") */ private $muted = 0; @@ -73,6 +73,11 @@ class ChannelMember */ private $last_messages_increment = 0; //Will increment on each new message to count notifications + /** + * @ORM\Column(name="last_quoted_message_id", type="text") + */ + private $last_quoted_message_id = ""; //Will be set when the user is quoted to the quoted message id + /** * ChannelMember constructor. * @param $user @@ -193,7 +198,7 @@ public function getMuted() } /** - * @param mixed $muted + * @param mixed $muted 0: no, 1: mute default (except @all, @[user]), 2: mute all except user mension, 3: mute everything */ public function setMuted($muted) { @@ -216,4 +221,20 @@ public function setLastMessagesIncrement($last_messages_increment) $this->last_messages_increment = $last_messages_increment; } + /** + * @return mixed + */ + public function getLastQuotedMessageId() + { + return $this->last_quoted_message_id; + } + + /** + * @param mixed $last_quoted_message_id + */ + public function setLastQuotedMessageId($last_quoted_message_id) + { + $this->last_quoted_message_id = $last_quoted_message_id; + } + } diff --git a/twake/backend/core/src/Twake/Channels/Services/ChannelSystemAbstract.php b/twake/backend/core/src/Twake/Channels/Services/ChannelSystemAbstract.php index 8bc988e9bf..ddb86b98c1 100755 --- a/twake/backend/core/src/Twake/Channels/Services/ChannelSystemAbstract.php +++ b/twake/backend/core/src/Twake/Channels/Services/ChannelSystemAbstract.php @@ -187,6 +187,8 @@ public function addTab($channel_id, $application_id, $name) $this->entity_manager->persist($channel); $this->entity_manager->flush(); + return $tab; + } public function addAllWorkspaceMember($workspace, $channel) @@ -217,6 +219,9 @@ public function updateChannelMembers($channel_entity, $members_ids, $current_use $members_ids[] = $current_user_id; } + $members_ids = array_unique($members_ids); + $final_members_ids = []; + $current_members = $channel_entity->getMembers(); $membersRepo = $this->entity_manager->getRepository("Twake\Channels:ChannelMember"); @@ -224,9 +229,20 @@ public function updateChannelMembers($channel_entity, $members_ids, $current_use foreach ($members_ids as $member_id) { if (!in_array($member_id, $current_members)) { - $member = new \Twake\Channels\Entity\ChannelMember($member_id . "", $channel_entity); - $member->setLastMessagesIncrement($channel_entity->getMessagesIncrement()); - $this->entity_manager->persist($member); + //Check if user is in workspace + $canBeAdded = true; + if(!$channel_entity->getDirect()){ + $wuRepo = $this->entity_manager->getRepository("Twake\Workspaces:WorkspaceUser"); + $canBeAdded = !!$wuRepo->findBy(Array("workspace" => $channel_entity->getOriginalWorkspaceId()."", "user" => $member_id."")); + } + if($canBeAdded){ + $member = new \Twake\Channels\Entity\ChannelMember($member_id . "", $channel_entity); + $member->setLastMessagesIncrement($channel_entity->getMessagesIncrement()); + $this->entity_manager->persist($member); + $final_members_ids[] = $member_id; + } + }else{ + $final_members_ids[] = $member_id; } } @@ -239,7 +255,7 @@ public function updateChannelMembers($channel_entity, $members_ids, $current_use } } - $channel_entity->setMembers($members_ids); + $channel_entity->setMembers($final_members_ids); $this->entity_manager->persist($channel_entity); $this->entity_manager->flush(); diff --git a/twake/backend/core/src/Twake/Channels/Services/ChannelsNotificationsSystem.php b/twake/backend/core/src/Twake/Channels/Services/ChannelsNotificationsSystem.php index 2ada932f64..5715d1f1a4 100755 --- a/twake/backend/core/src/Twake/Channels/Services/ChannelsNotificationsSystem.php +++ b/twake/backend/core/src/Twake/Channels/Services/ChannelsNotificationsSystem.php @@ -34,16 +34,21 @@ public function newElement($channel, $sender_application = null, $sender_user = $workspace_ent = $this->doctrine->getRepository("Twake\Workspaces:Workspace")->find($workspace); $users_to_notify = []; - $users_to_notify_mention = []; + $mentions_types = []; foreach ($members as $member) { - $mention = strpos(json_encode($message->getContent()), $member->getUserId()) !== false; - $mention = $mention || strpos(json_encode($message->getContent()), "@here") !== false; - $mention = $mention || strpos(json_encode($message->getContent()), "@all") !== false; - - $muted = $member->getMuted(); - if ($muted && $mention) { + $user_mention = strpos(json_encode($message->getContent()), $member->getUserId()) !== false; + $here_mention = strpos(json_encode($message->getContent()), "@here") !== false; + $all_mention = strpos(json_encode($message->getContent()), "@all") !== false; + $any_mention = $here_mention || $all_mention || $user_mention; + + $muted_options = $member->getMuted(); + $mention_level = ($any_mention?1:0) + ($user_mention?1:0); //2 if @user, 1 if only @here + + $muted = true; + $mention_text = false; + if($mention_level >= $muted_options){ $muted = false; } @@ -51,9 +56,21 @@ public function newElement($channel, $sender_application = null, $sender_user = $user = $userRepo->find($member->getUserId()); - $member->setLastActivity(new \DateTime()); + if($mention_level === 1){ + $mention_text = "@".($all_mention?"all":"here"); + } + if($mention_level === 2){ + $mention_text = "@".$user->getUsername(); + } - $this->pusher->push(Array("type" => "update", "notification" => Array("channel" => $channel->getAsArray())), "notifications/" . $member->getUserId()); + $member->setLastActivity(new \DateTime()); + if($mention_text){ + $member->setLastQuotedMessageId("" . $message->getId()); + } + + $channel_array = $channel->getAsArray(); + $channel_array["_user_last_quoted_message_id"] = $member->getLastQuotedMessageId(); + $this->pusher->push(Array("type" => "update", "notification" => Array("channel" => $channel_array)), "notifications/" . $member->getUserId()); //Updating workspace and group notifications if (!$channel->getDirect()) { @@ -62,16 +79,15 @@ public function newElement($channel, $sender_application = null, $sender_user = } - if($mention){ - $users_to_notify_mention[] = $user; + if($mention_text){ + $mentions_types[$mention_text] = $mentions_types[$mention_text] ?: []; + $mentions_types[$mention_text][] = $user; }else{ $users_to_notify[] = $user; } - } else { - $member->setLastMessagesIncrement($channel->getMessagesIncrement()); - $member->setLastAccess(new \DateTime()); } + $this->doctrine->persist($member); } @@ -90,20 +106,23 @@ public function newElement($channel, $sender_application = null, $sender_user = true ); - $this->notificationSystem->pushNotification( - null, - $sender_application, - $sender_user, - $workspace_ent, - $channel, - $users_to_notify_mention, - "channel_" . $channel->getId(), - "@mentionned: ".$message_as_text, - $message ? $message->getId() : "", - Array(), - Array("push"), - true - ); + foreach($mentions_types as $mention_text => $users){ + error_log($mention_text); + $this->notificationSystem->pushNotification( + null, + $sender_application, + $sender_user, + $workspace_ent, + $channel, + $users, + "channel_" . $channel->getId(), + "@".ltrim($mention_text, "@").": ".$message_as_text, + $message ? $message->getId() : "", + Array(), + Array("push"), + true + ); + } $this->doctrine->persist($channel); @@ -168,9 +187,11 @@ public function unread($channel, $user) $member = $membersRepo->findOneBy(Array("direct" => $channel->getDirect(), "channel_id" => $channel->getId(), "user_id" => $user->getId())); $member->setLastMessagesIncrement($channel->getMessagesIncrement() - 1); + $member->setLastQuotedMessageId("force_unread"); $array = $channel->getAsArray(); $array["_user_last_message_increment"] = $member->getLastMessagesIncrement(); + $array["_user_last_quoted_message_id"] = $member->getLastQuotedMessageId(); $array["_user_last_access"] = $member->getLastAccess() ? $member->getLastAccess()->getTimestamp() : 0; $this->pusher->push(Array("type" => "update", "notification" => Array("channel" => $array)), "notifications/" . $user->getId()); @@ -210,9 +231,11 @@ public function read($channel, $user) $member->setLastMessagesIncrement($channel->getMessagesIncrement()); $member->setLastAccess(new \DateTime()); + $member->setLastQuotedMessageId(""); $array = $channel->getAsArray(); $array["_user_last_message_increment"] = $member->getLastMessagesIncrement(); + $array["_user_last_quoted_message_id"] = $member->getLastQuotedMessageId(); $array["_user_last_access"] = $member->getLastAccess() ? $member->getLastAccess()->getTimestamp() : 0; $this->pusher->push(Array("type" => "update", "notification" => Array("channel" => $array)), "notifications/" . $user->getId()); diff --git a/twake/backend/core/src/Twake/Channels/Services/ChannelsSystem.php b/twake/backend/core/src/Twake/Channels/Services/ChannelsSystem.php index 46b461fc93..2c1e154aec 100755 --- a/twake/backend/core/src/Twake/Channels/Services/ChannelsSystem.php +++ b/twake/backend/core/src/Twake/Channels/Services/ChannelsSystem.php @@ -74,6 +74,7 @@ public function get($options, $current_user) if ($res) { $tmp = $channel->getAsArray(); $tmp["_user_last_message_increment"] = $res->getLastMessagesIncrement(); + $tmp["_user_last_quoted_message_id"] = $res->getLastQuotedMessageId(); $tmp["_user_last_access"] = $res->getLastAccess() ? $res->getLastAccess()->getTimestamp() : null; $tmp["_user_muted"] = $res->getMuted(); $result[] = $tmp; @@ -158,18 +159,6 @@ public function save($object, $options, $current_user) $this->entity_manager->flush($channel); - //Send first message if created channel - if ($did_create) { - //Init channel with a first message - $init_message = Array( - "channel_id" => $channel->getId(), - "hidden_data" => Array("type" => "init_channel"), - "content" => "[]" - ); - $this->messages_service->save($init_message, Array()); - } - - //Private and non private users management if ($channel->getPrivate()) { $this->updateChannelMembers($channel, $members, $current_user->getId()); @@ -197,18 +186,34 @@ public function save($object, $options, $current_user) //Tabs + $tab = null; if (isset($object["_once_save_tab"])) { if (isset($object["_once_save_tab"]["id"]) && $object["_once_save_tab"]["id"]) { $this->renameTab($channel->getId(), $object["_once_save_tab"]["app_id"], $object["_once_save_tab"]["id"], $object["_once_save_tab"]["name"]); } else { - $this->addTab($channel->getId(), $object["_once_save_tab"]["app_id"], $object["_once_save_tab"]["name"]); + $tab = $this->addTab($channel->getId(), $object["_once_save_tab"]["app_id"], $object["_once_save_tab"]["name"]); } } if (isset($object["_once_remove_tab"])) { $this->removeTab($channel->getId(), $object["_once_remove_tab"]["app_id"], $object["_once_remove_tab"]["id"]); } if (isset($object["_once_save_tab_config"])) { - $this->updateTabConfiguration($channel->getId(), $object["_once_save_tab_config"]["app_id"], $object["_once_save_tab_config"]["id"], $object["_once_save_tab_config"]["configuration"]); + $tab_id = $object["_once_save_tab_config"]["id"]; + if($tab && !$tab_id){ + $tab_id = $tab->getId(); + } + $this->updateTabConfiguration($channel->getId(), $object["_once_save_tab_config"]["app_id"], $tab_id, $object["_once_save_tab_config"]["configuration"]); + } + + //Send first message if created channel + if ($did_create) { + //Init channel with a first message + $init_message = Array( + "channel_id" => $channel->getId(), + "hidden_data" => Array("type" => "init_channel"), + "content" => "[]" + ); + $this->messages_service->save($init_message, Array()); } return $channel->getAsArray(); diff --git a/twake/backend/core/src/Twake/Channels/Services/DirectMessagesSystem.php b/twake/backend/core/src/Twake/Channels/Services/DirectMessagesSystem.php index bf0bea691d..ad456b0096 100755 --- a/twake/backend/core/src/Twake/Channels/Services/DirectMessagesSystem.php +++ b/twake/backend/core/src/Twake/Channels/Services/DirectMessagesSystem.php @@ -59,6 +59,7 @@ public function get($options, $current_user) if ($channel) { $tmp = $channel->getAsArray(); $tmp["_user_last_message_increment"] = $link->getLastMessagesIncrement(); + $tmp["_user_last_quoted_message_id"] = $link->getLastQuotedMessageId(); $tmp["_user_last_access"] = $link->getLastAccess() ? $link->getLastAccess()->getTimestamp() : null; $tmp["_user_muted"] = $link->getMuted(); $result[] = $tmp; diff --git a/twake/backend/core/src/Twake/Core/Command/TwakeSchemaUpdateCommand.php b/twake/backend/core/src/Twake/Core/Command/TwakeSchemaUpdateCommand.php index 78d905cc12..ea546c9df9 100755 --- a/twake/backend/core/src/Twake/Core/Command/TwakeSchemaUpdateCommand.php +++ b/twake/backend/core/src/Twake/Core/Command/TwakeSchemaUpdateCommand.php @@ -378,6 +378,7 @@ private function convertType($type) "twake_timeuuid" => "timeuuid", "array" => "text", "twake_boolean" => "tinyint", + "tinyint" => "tinyint", "boolean" => "tinyint", "text" => "text", "twake_float" => "float", diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/DriverManager.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/DriverManager.php index 87247070d9..c360fb634d 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/DriverManager.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/DriverManager.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBigIntType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBigIntType.php index ae4eff24d0..dd85d7b51e 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBigIntType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBigIntType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBooleanType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBooleanType.php index 9c6cbe8b9a..1a18dbedda 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBooleanType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraBooleanType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraCounterType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraCounterType.php index 9d48606622..df292649a1 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraCounterType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraCounterType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraDateTimeType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraDateTimeType.php index f291a384c9..c1606a6e78 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraDateTimeType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraDateTimeType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraFloatType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraFloatType.php index c3ee50d031..fcf7895cc3 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraFloatType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraFloatType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraSearchableTextType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraSearchableTextType.php index b04e85b88d..4ec98d7cac 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraSearchableTextType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraSearchableTextType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraStringType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraStringType.php index 151730adc3..7db50f07a2 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraStringType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraStringType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTextType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTextType.php index 79111bdc7d..efd225e592 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTextType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTextType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTimeUUIDType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTimeUUIDType.php index f40a77bd02..02629fcd1c 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTimeUUIDType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/CassandraTimeUUIDType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBigIntType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBigIntType.php index d6d8033346..27092b6c44 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBigIntType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBigIntType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBooleanType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBooleanType.php index a6f9acd357..a21b43f4bf 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBooleanType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlBooleanType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlCounterType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlCounterType.php index a3a19df55b..fa98a04391 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlCounterType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlCounterType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlDateTimeType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlDateTimeType.php index 851091f526..373892aebf 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlDateTimeType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlDateTimeType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlFloatType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlFloatType.php index eaea9743a8..9cf18bd001 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlFloatType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlFloatType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlSearchableTextType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlSearchableTextType.php index e9847bd5f2..de4f9d3403 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlSearchableTextType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlSearchableTextType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlStringType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlStringType.php index cbae9f24d0..3c9bce570a 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlStringType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlStringType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTextType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTextType.php index 189b18cc32..6634da96c4 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTextType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTextType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTimeUUIDType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTimeUUIDType.php index ebcd310b60..ca22b82119 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTimeUUIDType.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/MysqlTimeUUIDType.php @@ -1,21 +1,5 @@ . - */ + namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/TinyintType.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/TinyintType.php new file mode 100755 index 0000000000..7fac423344 --- /dev/null +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/DBAL/Types/TinyintType.php @@ -0,0 +1,35 @@ +. - */ namespace Twake\Core\Services\DoctrineAdapter\DBAL\Types; diff --git a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/ManagerAdapter.php b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/ManagerAdapter.php index d9a22562c4..26be50461f 100755 --- a/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/ManagerAdapter.php +++ b/twake/backend/core/src/Twake/Core/Services/DoctrineAdapter/ManagerAdapter.php @@ -96,6 +96,7 @@ public function getEntityManager() 'twake_datetime' => 'Twake\Core\Services\DoctrineAdapter\DBAL\Types\\' . $driver_type . 'DateTimeType', 'twake_timeuuid' => 'Twake\Core\Services\DoctrineAdapter\DBAL\Types\\' . $driver_type . 'TimeUUIDType', 'twake_boolean' => 'Twake\Core\Services\DoctrineAdapter\DBAL\Types\\' . $driver_type . 'BooleanType', + 'tinyint' => 'Twake\Core\Services\DoctrineAdapter\DBAL\Types\\TinyintType', 'twake_no_salt_text' => 'Twake\Core\Services\DoctrineAdapter\DBAL\Types\\' . $driver_type . 'SearchableTextType', 'twake_text' => 'Twake\Core\Services\DoctrineAdapter\DBAL\Types\\' . $driver_type . 'TextType', 'twake_string' => 'Twake\Core\Services\DoctrineAdapter\DBAL\Types\\' . $driver_type . 'StringType', diff --git a/twake/backend/core/src/Twake/Discussion/Services/MessageSystem.php b/twake/backend/core/src/Twake/Discussion/Services/MessageSystem.php index 802090151c..bed1c289e9 100755 --- a/twake/backend/core/src/Twake/Discussion/Services/MessageSystem.php +++ b/twake/backend/core/src/Twake/Discussion/Services/MessageSystem.php @@ -470,6 +470,13 @@ public function save($object, $options, $user = null, $application = null) $channel->setLastActivity(new \DateTime()); $channel->setMessagesIncrement($channel->getMessagesIncrement() + 1); + //Sender autoread the channel + if($user){ + $membersRepo = $this->em->getRepository("Twake\Channels:ChannelMember"); + $member = $membersRepo->findOneBy(Array("direct" => $channel->getDirect(), "channel_id" => $channel->getId(), "user_id" => $user->getId())); + $member->setLastMessagesIncrement($channel->getMessagesIncrement()); + } + try{ $this->queues->push("message_dispatch_queue", [ "channel" => $channel->getId(), diff --git a/twake/frontend/scripts/find_non_translated_fields.py b/twake/frontend/scripts/find_non_translated_fields.py index 3714b83af9..1849ac65f9 100644 --- a/twake/frontend/scripts/find_non_translated_fields.py +++ b/twake/frontend/scripts/find_non_translated_fields.py @@ -1,7 +1,7 @@ import os import re -rootpath = '../src/app' +rootpath = os.path.abspath('../frontend/src/app') def nextGuillemet(s, i): for k in range(i , len(s)): diff --git a/twake/frontend/scripts/redundances_lan_fields.py b/twake/frontend/scripts/redundances_lan_fields.py index 63a4d48ad2..827c4792d8 100644 --- a/twake/frontend/scripts/redundances_lan_fields.py +++ b/twake/frontend/scripts/redundances_lan_fields.py @@ -1,6 +1,7 @@ import use_of_the_lan_fields as sc import os +import sys sc.init() items = sc.dicstr.items() @@ -20,34 +21,48 @@ def redundance(): if k1!=k2:# and v1[-1]!='': b= True for l in range(len(min(v1,v2))): - b = b and v1[l]==v2[l] + b = b and v1[l] == v2[l] if b: update_rep(v1[-1],k1) def overwrite(): #overwriting + meta = [item for sublist in [it for it in dicrep.values()] for item in sublist] + print(meta) for dossier, sous_dossiers, fichiers in os.walk(sc.rootpath): for fichier in fichiers: currentpath = os.path.join(dossier, fichier) if currentpath.endswith(".js") and (currentpath.count(".")==1): if currentpath.__contains__("languages"): continue + b = False - lecture = open(currentpath, "r") + lecture = open(currentpath, "r+") s = lecture.read() t = s.split("'")[1::2] for sub in t: - if sub in dicrep.values(): + if sub in meta: #replace sub by dicrep[sub][0] in file - a=0 + en_sub = sc.dicstr.get(sub)[-1] + if len(dicrep.get(en_sub))>3 and en_sub: + repsub = dicrep.get(en_sub)[0] + s = s.replace(sub, repsub) + b = True + if b: + print('Begin Lecture') + lecture.seek(0) + lecture.write(s) + print("Changed: " + currentpath) lecture.close() - -ecriture = open('fichier3.txt', "w") +redundance() +ecriture = open('../fichier3.txt', "w") c=0 for key, value in dicrep.items(): - c+= len(value) - ecriture.write(key + " : "+ str(value)+" " + str(len(value))+ "\n") + if len(value)>3 and key: + c+= len(value) + ecriture.write(key + " : "+ str(value)+" " + str(len(value))+ "\n") ecriture.write(str(c)) ecriture.close() +overwrite() diff --git a/twake/frontend/scripts/use_of_the_lan_fields.py b/twake/frontend/scripts/use_of_the_lan_fields.py index 89677961cc..cfc662b9da 100644 --- a/twake/frontend/scripts/use_of_the_lan_fields.py +++ b/twake/frontend/scripts/use_of_the_lan_fields.py @@ -1,8 +1,7 @@ import os import re -rootpath = '..' - +rootpath = os.path.abspath('..') #2 dictionnaries : 1 with the nb of occurences, 1 with the strings in the various languages dicoc = dict() @@ -37,11 +36,10 @@ def get_string(s): def init(): #initialization of the strings dictionnaries - for dossier, sous_dossiers, fichiers in os.walk(rootpath + "src/app/services/languages/locale/"): + for dossier, sous_dossiers, fichiers in os.walk(rootpath + "/frontend/src/app/services/languages/locale/"): for fichier in fichiers: currentpath = os.path.join(dossier, fichier) - if currentpath.endswith(".js") and (currentpath.count(".")==1): - print(currentpath) + if currentpath.endswith(".js") and (currentpath.count(".")==1) and 'ja' not in currentpath and not currentpath.endswith('es.js'): lecture = open(currentpath, "r") s = lecture.read() @@ -91,7 +89,7 @@ def main(): count() ecriture = open('../fichier2.txt', "w") for key, value in dicstr.items(): - if dicoc[key] ==0 or len(value)<4 or value.__contains__('') or value.__contains__('No traduction'): + if (len(value)<3 or '' in value or 'No traduction'in value) and dicoc[key] >= 0: ecriture.write(key + " : "+ str(value)+" "+ str(dicoc[key]) + "\n") ecriture.close() #print(dicstr) diff --git a/twake/frontend/src/app/components/ConnectionIndicator/ConnectionIndicator.js b/twake/frontend/src/app/components/ConnectionIndicator/ConnectionIndicator.js index f072b701b4..994810bd7b 100644 --- a/twake/frontend/src/app/components/ConnectionIndicator/ConnectionIndicator.js +++ b/twake/frontend/src/app/components/ConnectionIndicator/ConnectionIndicator.js @@ -4,6 +4,7 @@ import WebsocketsManager from 'services/websocket.js'; import ErrorOutlinedIcon from '@material-ui/icons/ErrorOutlined'; import HourglassEmpty from '@material-ui/icons/HourglassEmpty'; import CheckCircleIcon from '@material-ui/icons/CheckCircle'; +import Languages from 'services/languages/languages.js'; export default class ConnectionIndicator extends React.Component { constructor(props) { @@ -22,17 +23,18 @@ export default class ConnectionIndicator extends React.Component { > {WebsocketsManager.connected === false && WebsocketsManager.is_reconnecting !== true && (
- Vous êtes hors ligne + {' '} + {Languages.t('general.connexion_status.disconnected')}
)} {WebsocketsManager.connected === false && WebsocketsManager.is_reconnecting === true && (
- Reconnexion en cours... + {Languages.t('general.connexion_status.connecting')}
)} {WebsocketsManager.connected === true && (
- Vous êtes connecté + {Languages.t('general.connexion_status.connected')}
)} diff --git a/twake/frontend/src/app/components/Drive/DriveElement.js b/twake/frontend/src/app/components/Drive/DriveElement.js index cdd358dec5..ccbbf75fce 100755 --- a/twake/frontend/src/app/components/Drive/DriveElement.js +++ b/twake/frontend/src/app/components/Drive/DriveElement.js @@ -340,7 +340,7 @@ export default class DriveElement extends React.Component { disabled={(this.state.new_name || '').length <= 0} type="button" value={Languages.t( - 'scenes.apps.messages.message.save_button', + 'general.save', [], 'Enregistrer', )} diff --git a/twake/frontend/src/app/components/Drive/FilePicker/FilePicker.js b/twake/frontend/src/app/components/Drive/FilePicker/FilePicker.js index ba4149ded9..328e126ca3 100755 --- a/twake/frontend/src/app/components/Drive/FilePicker/FilePicker.js +++ b/twake/frontend/src/app/components/Drive/FilePicker/FilePicker.js @@ -117,7 +117,7 @@ export default class FilePicker extends React.Component { }} /> )}{' '} - {directory.parent_id ? directory.name : 'Documents'} + {directory.parent_id ? directory.name : Languages.t('app.name.twake_drive', [], 'Documents')}
{directories.map((item, index) => ( diff --git a/twake/frontend/src/app/components/Drive/VersionDetails.js b/twake/frontend/src/app/components/Drive/VersionDetails.js index 6d2e7698d4..ba3ed64ff6 100755 --- a/twake/frontend/src/app/components/Drive/VersionDetails.js +++ b/twake/frontend/src/app/components/Drive/VersionDetails.js @@ -68,11 +68,11 @@ export default class VersionDetails extends React.Component { } title={
- Versions + {Languages.t('scenes.apps.drive.right_preview.versions', [], 'Versions')}
} > -
+
Nothing more
diff --git a/twake/frontend/src/app/components/Icon/Icon.js b/twake/frontend/src/app/components/Icon/Icon.js index 40f39d043b..e3d97a2e9c 100755 --- a/twake/frontend/src/app/components/Icon/Icon.js +++ b/twake/frontend/src/app/components/Icon/Icon.js @@ -19,13 +19,24 @@ export default class Icon extends React.Component { return false; } render() { - return ( - - ); + if ((this.props.type || '').indexOf('http') === 0) { + return ( +
+ ); + } else { + return ( + + ); + } } } diff --git a/twake/frontend/src/app/components/Icon/unicons.scss b/twake/frontend/src/app/components/Icon/unicons.scss index b49fec80bb..528d440534 100755 --- a/twake/frontend/src/app/components/Icon/unicons.scss +++ b/twake/frontend/src/app/components/Icon/unicons.scss @@ -20,6 +20,10 @@ } */ +.no-margin-left::before { + margin-left: 0 !important; +} + [class^='uil-']:before, [class*=' uil-']:before { font-family: 'unicons'; diff --git a/twake/frontend/src/app/components/InfiniteMessages/InfiniteMessages.js b/twake/frontend/src/app/components/InfiniteMessages/InfiniteMessages.js index 3653a24fb1..807b14b209 100755 --- a/twake/frontend/src/app/components/InfiniteMessages/InfiniteMessages.js +++ b/twake/frontend/src/app/components/InfiniteMessages/InfiniteMessages.js @@ -99,7 +99,7 @@ export default class InfiniteMessages extends Component { this.scrollToBottom(); var dom_fake_separator_top_visible = Math.max( 0, - this.dom_infinite_messages.clientHeight - this.dom_visualized_messages_top.clientHeight + this.dom_infinite_messages.clientHeight - this.dom_visualized_messages_top.clientHeight, ); if (dom_fake_separator_top_visible == 0) { this.dom_fake_separator_top.style.display = 'none'; @@ -117,7 +117,7 @@ export default class InfiniteMessages extends Component { this.dom_anything_on_top.clientHeight + (this.did_update_messages_data.bloc_bottom_height - (this.did_update_messages_data.scroll_height - - this.did_update_messages_data.scroll_top)) + this.did_update_messages_data.scroll_top)), ); } else if (this.did_update_messages_data.direction == 'bottom_auto_add') { //Nothing @@ -263,7 +263,7 @@ export default class InfiniteMessages extends Component { 'get previous messages before ', this.messages_min.id, ' min was ', - (this.no_more_before || {}).id + (this.no_more_before || {}).id, ); this.number_of_messages_to_load = 2 * (this.dom_infinite_messages.clientHeight / 20); @@ -278,7 +278,7 @@ export default class InfiniteMessages extends Component { } var top_list = this.state.messages.filter( - m => this.compare(m, this.messages_min) >= 0 && this.compare(m, this.messages_med) <= 0 + m => this.compare(m, this.messages_min) >= 0 && this.compare(m, this.messages_med) <= 0, ); top_list = res.concat(top_list); @@ -339,7 +339,7 @@ export default class InfiniteMessages extends Component { top_list = top_list.concat(res); this.state.messages = this.props.messages.filter( - m => this.compare(m, this.on_load_min) > 0 + m => this.compare(m, this.on_load_min) > 0, ); this.max_known = this.state.messages[this.state.messages.length - 1]; @@ -361,7 +361,7 @@ export default class InfiniteMessages extends Component { this.setState({ messages: this.state.messages }); } else { var top_list = this.state.messages.filter( - m => this.compare(m, this.messages_med) > 0 && this.compare(m, this.messages_max) <= 0 + m => this.compare(m, this.messages_med) > 0 && this.compare(m, this.messages_max) <= 0, ); top_list = top_list.concat(res); @@ -384,7 +384,7 @@ export default class InfiniteMessages extends Component { } this.is_getting_bottom_messages = false; - } + }, ); } diff --git a/twake/frontend/src/app/components/InlineTagPicker/InlineTagPicker.js b/twake/frontend/src/app/components/InlineTagPicker/InlineTagPicker.js new file mode 100644 index 0000000000..4f8c74fb48 --- /dev/null +++ b/twake/frontend/src/app/components/InlineTagPicker/InlineTagPicker.js @@ -0,0 +1,27 @@ +import React, { Component } from 'react'; +import './InlineTagPicker.scss'; + +export default class InlineTagPicker extends Component { + render() { + return this.props.available.map(item => { + return ( +
{ + let array = (this.props.value || []).map(a => a); + if (this.props.value.includes(item)) { + array = this.props.value.filter(val => item !== val); + } else { + array.push(item); + } + this.props.onChange(array); + }} + > + {item} +
+ ); + }); + } +} diff --git a/twake/frontend/src/app/components/InlineTagPicker/InlineTagPicker.scss b/twake/frontend/src/app/components/InlineTagPicker/InlineTagPicker.scss new file mode 100644 index 0000000000..701aefcfbe --- /dev/null +++ b/twake/frontend/src/app/components/InlineTagPicker/InlineTagPicker.scss @@ -0,0 +1,23 @@ +.inline-tag { + cursor: pointer; + background: var(--grey-light); + border-radius: var(--default-border-radius); + height: 20px; + color: var(--grey-dark); + font-size: 12px; + padding: 0 5px; + line-height: 18px; + box-sizing: border-box; + width: auto; + display: inline-block; + margin-right: 6px; + font-weight: normal; + &.selected { + background: var(--green); + color: var(--white); + } + &:hover { + transition: 0.3s; + opacity: 0.9; + } +} diff --git a/twake/frontend/src/app/components/Leftbar/Channel/Channel.js b/twake/frontend/src/app/components/Leftbar/Channel/Channel.js index adefcffaf2..c506a6df3a 100755 --- a/twake/frontend/src/app/components/Leftbar/Channel/Channel.js +++ b/twake/frontend/src/app/components/Leftbar/Channel/Channel.js @@ -18,10 +18,11 @@ export default class Channel extends React.Component { 0 ? 'has_notifications ' : '') + (!!this.props.selected ? 'selected ' : '') + + (!!this.props.muted ? 'muted ' : '') + + (!!this.props.alinea ? 'extra-margin ' : '') + + (this.props.notifications > 0 ? 'has_notifications ' : '') + + (this.props.hasNewContent > 0 ? 'has_new_content ' : '') } parentClassOnDrag="dragging_channel_view" minMove={5} @@ -36,9 +37,9 @@ export default class Channel extends React.Component {
)}
- {this.props.icon && } - {this.props.emoji && } - {this.props.users && ( + {!!this.props.icon && } + {!!this.props.emoji && } + {!!this.props.users && (
{this.props.users.map(user => { return ( @@ -48,7 +49,7 @@ export default class Channel extends React.Component {
)}
- {this.props.notMember && ( + {!!this.props.notMember && ( )} - {this.props.appIndicator &&
APP
} - {this.props.users && this.props.users.length > 1 && ( + {!!this.props.appIndicator &&
APP
} + {!!this.props.users && this.props.users.length > 1 && (
{this.props.users.length}
)} - {this.props.imported && ( + {!!this.props.imported && ( {Math.max(1, this.props.notifications)}
)} - {this.props.muted && } + {!!this.props.muted && }
{ diff --git a/twake/frontend/src/app/components/Leftbar/Channel/Channel.scss b/twake/frontend/src/app/components/Leftbar/Channel/Channel.scss index a403af960c..f848bcd9f3 100755 --- a/twake/frontend/src/app/components/Leftbar/Channel/Channel.scss +++ b/twake/frontend/src/app/components/Leftbar/Channel/Channel.scss @@ -90,7 +90,7 @@ padding-left: 6px; } - &.has_notifications { + &.has_new_content { font-weight: 700; } diff --git a/twake/frontend/src/app/components/Leftbar/Footer/Footer.scss b/twake/frontend/src/app/components/Leftbar/Footer/Footer.scss index 1dc793e6e5..89eaa9ba92 100755 --- a/twake/frontend/src/app/components/Leftbar/Footer/Footer.scss +++ b/twake/frontend/src/app/components/Leftbar/Footer/Footer.scss @@ -79,9 +79,9 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - flex: 1; margin-left: 20px; cursor: pointer; + display: inline; &.free { background: #fff3cd; diff --git a/twake/frontend/src/app/components/Parameters/Attribute.js b/twake/frontend/src/app/components/Parameters/Attribute.js index 6c60b5e5e0..15e57f9991 100755 --- a/twake/frontend/src/app/components/Parameters/Attribute.js +++ b/twake/frontend/src/app/components/Parameters/Attribute.js @@ -70,11 +70,13 @@ export default class Attribute extends React.Component { } > diff --git a/twake/frontend/src/app/components/TagPicker/TagPicker.js b/twake/frontend/src/app/components/TagPicker/TagPicker.js index 42eaaac1ac..5bd955893a 100755 --- a/twake/frontend/src/app/components/TagPicker/TagPicker.js +++ b/twake/frontend/src/app/components/TagPicker/TagPicker.js @@ -174,7 +174,7 @@ export default class TagPicker extends React.Component { }} > {' '} - {Languages.t('scenes.apps.tasks.task.add', [], 'Add')} + {Languages.t('general.add', [], 'Add')} )} diff --git a/twake/frontend/src/app/components/Twacode/PseudoMarkdownDictionary.js b/twake/frontend/src/app/components/Twacode/PseudoMarkdownDictionary.js index 7abb699afe..d86c1f356b 100755 --- a/twake/frontend/src/app/components/Twacode/PseudoMarkdownDictionary.js +++ b/twake/frontend/src/app/components/Twacode/PseudoMarkdownDictionary.js @@ -65,8 +65,12 @@ class PseudoMarkdownDictionary { if (!object.url && object.url !== undefined) { return {child}; } + var protocol = 'https'; + if ((object.url || object.content || '').indexOf('http://')) { + protocol = 'http'; + } var orig_url = - 'http://' + (object.url || object.content || '').replace(/^(https?:\/\/)/, ''); + protocol + '://' + (object.url || object.content || '').replace(/^(https?:\/\/)/, ''); var url = orig_url; if (object.user_identifier && UserService.getCurrentUser()) { var separator = '?'; diff --git a/twake/frontend/src/app/components/Twacode/Twacode.scss b/twake/frontend/src/app/components/Twacode/Twacode.scss index df8211936a..ca8fbdec45 100755 --- a/twake/frontend/src/app/components/Twacode/Twacode.scss +++ b/twake/frontend/src/app/components/Twacode/Twacode.scss @@ -91,36 +91,45 @@ background: rgba(0, 0, 0, 0); } .user_twacode { - font-weight: 500; - box-sizing: border-box; - color: $black; - height: 18px; - text-transform: capitalize; - border-radius: var(--default-border-radius); - text-overflow: ellipsis; - white-space: nowrap; - display: inline-block; - padding-right: 5px; - margin-right: -2px; - vertical-align: top; - background: $primary_background; - cursor: pointer; - - &:hover { - color: $primary; + &.highlighted, + &.with_user.highlighted { + background: #fff455; + font-weight: 500; + box-sizing: border-box; + border-radius: var(--default-border-radius); } - - .userimage { - width: 16px; - height: 16px; + &.with_user { + font-weight: 500; + box-sizing: border-box; + color: $black; + height: 18px; + text-transform: capitalize; border-radius: var(--default-border-radius); + text-overflow: ellipsis; + white-space: nowrap; display: inline-block; + padding-right: 5px; + margin-right: -2px; vertical-align: top; - background: $grey_light; - margin: 1px; - margin-right: 3px; - background-size: cover; - background-position: center; + background: $primary_background; + cursor: pointer; + + &:hover { + color: $primary; + } + + .userimage { + width: 16px; + height: 16px; + border-radius: var(--default-border-radius); + display: inline-block; + vertical-align: top; + background: $grey_light; + margin: 1px; + margin-right: 3px; + background-size: cover; + background-position: center; + } } } .channel_twacode { diff --git a/twake/frontend/src/app/components/Twacode/blocks/Chan.js b/twake/frontend/src/app/components/Twacode/blocks/Chan.js index 37b497954f..7ba40dc4c1 100755 --- a/twake/frontend/src/app/components/Twacode/blocks/Chan.js +++ b/twake/frontend/src/app/components/Twacode/blocks/Chan.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import Collections from 'services/Collections/Collections.js'; import Emojione from 'components/Emojione/Emojione.js'; +import ChannelsService from 'services/channels/channels.js'; export default class CHan extends React.Component { render() { @@ -10,7 +11,12 @@ export default class CHan extends React.Component { var chan = Collections.get('channels').find(this.props.id); return ( -
+
{ + if (chan) ChannelsService.select(chan); + }} + > {chan.name}
diff --git a/twake/frontend/src/app/components/Twacode/blocks/User.js b/twake/frontend/src/app/components/Twacode/blocks/User.js index 909d2aaddd..e6e2eef959 100755 --- a/twake/frontend/src/app/components/Twacode/blocks/User.js +++ b/twake/frontend/src/app/components/Twacode/blocks/User.js @@ -13,14 +13,25 @@ export default class User extends React.Component { Collections.get('users').removeListener(this); } render() { + const highlighted = + this.props.id == UserService.getCurrentUserId() || + this.props.username == 'here' || + this.props.username == 'all'; if (!this.props.id) { - return @{this.props.username}; + return ( + + @{this.props.username} + + ); } var id = this.props.id; var user = Collections.get('users').find(id); if (user) { return ( -
ChannelsService.openDiscussion([user.id])}> +
ChannelsService.openDiscussion([user.id])} + >
@{this.props.username}; + return ( + + @{this.props.username} + + ); } } } diff --git a/twake/frontend/src/app/components/constants.scss b/twake/frontend/src/app/components/constants.scss index 689cb6483f..f1e3ffb673 100755 --- a/twake/frontend/src/app/components/constants.scss +++ b/twake/frontend/src/app/components/constants.scss @@ -24,6 +24,8 @@ $primary_background: #f3f2ff;*/ --pale-grey: #f5f5f7; --default-border-radius: 3px; --default-border-radius-large: 5px; + --green: #18af2c; + --red: #ff5154; } $primary: var(--primary); @@ -39,8 +41,8 @@ $white: var(--white); $grey_background: var(--grey-background); -$green: #3dcc97; -$red: #ff5154; +$green: var(--green); +$red: var(--red); $yellow: #fed453; $yellow_background: #fffbee; diff --git a/twake/frontend/src/app/scenes/App/ChannelsBar/Channel.js b/twake/frontend/src/app/scenes/App/ChannelsBar/Channel.js index 1876f4107f..d76390569e 100755 --- a/twake/frontend/src/app/scenes/App/ChannelsBar/Channel.js +++ b/twake/frontend/src/app/scenes/App/ChannelsBar/Channel.js @@ -75,12 +75,48 @@ export default class Channel extends Component { menu.push({ type: 'menu', - text: channel._user_muted - ? Languages.t('scenes.app.channelsbar.remove_mute', [], 'Enlever la sourdine') - : Languages.t('scenes.app.channelsbar.mute', [], 'Sourdine'), + text: 'Notifications...', onClick: () => { Notifications.mute(channel, !channel._user_muted); }, + submenu: [ + { + type: 'title', + text: 'Get notifications on', + }, + { + type: 'menu', + icon: channel._user_muted === 0 ? 'check' : null, + text: 'Any message', + onClick: () => { + Notifications.mute(channel, 0); + }, + }, + { + type: 'menu', + icon: channel._user_muted === 1 ? 'check' : null, + text: '@all, @here and @' + UserService.getCurrentUser().username, + onClick: () => { + Notifications.mute(channel, 1); + }, + }, + { + type: 'menu', + icon: channel._user_muted === 2 ? 'check' : null, + text: '@' + UserService.getCurrentUser().username + ' only', + onClick: () => { + Notifications.mute(channel, 2); + }, + }, + { + type: 'menu', + icon: channel._user_muted === 3 ? 'check' : null, + text: 'Nothing', + onClick: () => { + Notifications.mute(channel, 3); + }, + }, + ], }); if (has_notification) { @@ -104,27 +140,29 @@ export default class Channel extends Component { /** * Pinned channel preference */ - var pinned_channels_preferences = - ( - ((Collections.get('users').find(UserService.getCurrentUserId()) || {}) - .workspaces_preferences || {})[Workspaces.currentWorkspaceId] || {} - ).pinned_channels || {}; - if (!pinned_channels_preferences[channel.id]) { - menu.push({ - type: 'menu', - text: 'Star this channel', - onClick: () => { - ChannelsService.pinChannel(channel, true); - }, - }); - } else { - menu.push({ - type: 'menu', - text: 'Unstar this channel', - onClick: () => { - ChannelsService.pinChannel(channel, false); - }, - }); + if (!channel.direct && !channel.app_id) { + var pinned_channels_preferences = + ( + ((Collections.get('users').find(UserService.getCurrentUserId()) || {}) + .workspaces_preferences || {})[Workspaces.currentWorkspaceId] || {} + ).pinned_channels || {}; + if (!pinned_channels_preferences[channel.id]) { + menu.push({ + type: 'menu', + text: Languages.t('scenes.apps.messages.left_bar.stream.star'), + onClick: () => { + ChannelsService.pinChannel(channel, true); + }, + }); + } else { + menu.push({ + type: 'menu', + text: Languages.t('scenes.apps.messages.left_bar.stream.unstar'), + onClick: () => { + ChannelsService.pinChannel(channel, false); + }, + }); + } } if (!channel.direct && WorkspaceUserRights.hasWorkspacePrivilege()) { @@ -255,6 +293,12 @@ export default class Channel extends Component { Notifications.listenOnly(this, ['channel_' + channel.id]); ChannelsService.updateBadge(channel); + let new_content_count = (Notifications.notification_by_channel[channel.id] || {}).count || 0; + let notifications_count = new_content_count; + if(channel._user_muted >= 1 && !channel._user_last_quoted_message_id){ + notifications_count = 0; + } + return ( (this.node = node)} @@ -267,7 +311,7 @@ export default class Channel extends Component { appIndicator={this.mode == 'direct_app'} notMember={this.mode == 'direct' && this.props.outOfWorkspace} private={channel.private} - muted={channel._user_muted} + muted={channel._user_muted >= 1} favorite={this.props.pinned} public={ ( @@ -276,7 +320,8 @@ export default class Channel extends Component { .filter(userId => channel.private || !WorkspacesUser.isAutoAddUser(userId)) || [] ).length } - notifications={(Notifications.notification_by_channel[channel.id] || {}).count || 0} + hasNewContent={new_content_count} + notifications={notifications_count} selected={ChannelsService.currentChannelFrontId == this.props.channel.front_id} dragData={this.props.channel} onClick={evt => ChannelsService.select(this.props.channel)} diff --git a/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelTemplateEditor.js b/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelTemplateEditor.js index ae7b2863c8..e43bfddf70 100755 --- a/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelTemplateEditor.js +++ b/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelTemplateEditor.js @@ -135,8 +135,8 @@ export default class ChannelTemplateEditor extends Component { type="button" value={ this.state.channel.id - ? Languages.t('scenes.app.channelsbar.save_channel_button', 'Save') - : Languages.t('scenes.app.channelsbar.add_channel_button', 'Add') + ? Languages.t('general.save', 'Save') + : Languages.t('general.add', 'Add') } onClick={() => this.updateChan()} /> diff --git a/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelsUser/ChannelsUser.js b/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelsUser/ChannelsUser.js index 6670ceb995..55a7419cc5 100755 --- a/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelsUser/ChannelsUser.js +++ b/twake/frontend/src/app/scenes/App/ChannelsBar/ChannelsUser/ChannelsUser.js @@ -202,13 +202,17 @@ export default class ChannelsUser extends Component { if (channel._user_last_message_increment - channel.messages_increment < 0) { keep = true; } - if (this.membersInWorkspace(channel.members) && channel.messages_increment > 0) { + if (this.membersInWorkspace(channel.members) && channel.messages_increment > 1) { + //Remove if only first message keep = true; } if (this.state.channels.currentChannelFrontId == channel.front_id) { keep = true; } - if (channel._user_last_access > new Date().getTime() / 1000 - 7 * 24 * 60 * 60) { + if ( + channel._user_last_access > new Date().getTime() / 1000 - 7 * 24 * 60 * 60 && + channel.messages_increment > 1 + ) { keep = true; } return keep; diff --git a/twake/frontend/src/app/scenes/App/MainView/MainView.js b/twake/frontend/src/app/scenes/App/MainView/MainView.js index 8b34af24cf..ac5bf692f8 100755 --- a/twake/frontend/src/app/scenes/App/MainView/MainView.js +++ b/twake/frontend/src/app/scenes/App/MainView/MainView.js @@ -112,13 +112,13 @@ export default class MainView extends Component { } render() { var current_side_channel = Collections.get('channels').findByFrontId( - this.state.channels.currentSideChannelFrontId + this.state.channels.currentSideChannelFrontId, ); var current_channel = Collections.get('channels').findByFrontId( - this.state.channels.currentChannelFrontId + this.state.channels.currentChannelFrontId, ); var current_channel_tab = Collections.get('channel_tabs').find( - this.state.channels.current_tab_id + this.state.channels.current_tab_id, ); if (this.state.channels.current_tab_id) { @@ -129,7 +129,7 @@ export default class MainView extends Component { ) { Collections.get('channel_tabs').completeObject(item); current_channel_tab = Collections.get('channel_tabs').find( - this.state.channels.current_tab_id + this.state.channels.current_tab_id, ); return false; } @@ -143,7 +143,7 @@ export default class MainView extends Component { {Languages.t( 'scenes.app.mainview.instruction_current_tab', [], - 'Commencez par sélectionner une chaîne sur votre gauche.' + 'Commencez par sélectionner une chaîne sur votre gauche.', )}
@@ -206,7 +206,7 @@ export default class MainView extends Component { {!!icon && } {!!emoji && }
- {app.name} + {Languages.t('app.name.' + app.simple_name, [], app.name)} {!!current_channel.private && }
diff --git a/twake/frontend/src/app/scenes/App/Popup/AddUser/AddUser.js b/twake/frontend/src/app/scenes/App/Popup/AddUser/AddUser.js index 727585435e..7c0704a897 100755 --- a/twake/frontend/src/app/scenes/App/Popup/AddUser/AddUser.js +++ b/twake/frontend/src/app/scenes/App/Popup/AddUser/AddUser.js @@ -176,15 +176,6 @@ export default class AddUser extends Component { }} className="full_width medium" /> - this.onChangeMail({ externe: state ? '1' : '0' }, index)} - /> ); } @@ -233,11 +224,11 @@ export default class AddUser extends Component { (this.state.all_import && this.state.multi) ) ? this.state.i18n.t( - 'scenes.apps.parameters.group_sections.managers.invite_manager_button_skip', - 'Skip', + 'scenes.apps.parameters.group_sections.managers.invite_manager_button_skip', + 'Skip', ) : this.state.i18n.t( - 'scenes.apps.parameters.group_sections.managers.invite_manager_button', + 'general.add', ) } loading={this.state.workspacesUsersService.loading || this.props.loading} diff --git a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/AppsParameters.js b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/AppsParameters.js index cb81fd32c7..878fb60429 100755 --- a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/AppsParameters.js +++ b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/AppsParameters.js @@ -8,6 +8,7 @@ import popupManager from 'services/popupManager/popupManager.js'; import userService from 'services/user/user.js'; import currentUserService from 'services/user/current_user.js'; import WorkspaceApps from './Pages/WorkspaceApps.js'; +import WorkspaceAppsInformations from './Pages/WorkspaceAppsInformations.js'; import TwacodeTester from './Pages/TwacodeTester.js'; import MenuList from 'components/Menus/MenuComponent.js'; import './AppsParameters.scss'; @@ -48,11 +49,13 @@ export default class AppsParameters extends Component { Collections.get('users').removeListener(this); } displayScene() { - if (this.state.page == 1) { - return ; - } - if (this.state.page == 2) { - return ; + switch (this.state.page) { + case 1: + return ; + case 2: + return ; + case 3: + return ; } } @@ -71,7 +74,7 @@ export default class AppsParameters extends Component { text: Languages.t( 'scenes.app.popup.workspaceparameter.pages.your_apps_label', [], - 'Vos applications' + 'Vos applications', ), emoji: ':control_knobs:', selected: this.state.page == 1, @@ -79,11 +82,18 @@ export default class AppsParameters extends Component { }, { type: 'menu', - text: 'Twacode tester', - emoji: ':love_letter:', + text: 'Basic informations', + emoji: ':information_source:', selected: this.state.page == 2, onClick: () => this.setPage(2), }, + { + type: 'menu', + text: 'Twacode tester', + emoji: ':love_letter:', + selected: this.state.page == 3, + onClick: () => this.setPage(3), + }, { type: 'menu', text: Languages.t('general.back', [], 'Retour'), diff --git a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/Pages.scss b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/Pages.scss index 3be674dd8a..e1de60b1f9 100755 --- a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/Pages.scss +++ b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/Pages.scss @@ -144,9 +144,7 @@ box-shadow: 0 0 15px rgba(0, 0, 0, 0.3); margin: 15px; margin-top: 0px; - background: #555; border-radius: var(--default-border-radius-large); - color: #fff; padding: 15px; } diff --git a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/TwacodeTester.js b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/TwacodeTester.js index 47768e40e9..edf8374f35 100755 --- a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/TwacodeTester.js +++ b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/TwacodeTester.js @@ -26,7 +26,7 @@ export default class TwacodeTester extends Component { content: Languages.t( 'scenes.app.popup.appsparameters.pages.call_event_handlers', ['interactive_action', id, +JSON.stringify(passives)], - "Gestionnaire d'événement d'appels de type $1 et d'événement '$2', avec les passifs : $3" + "Event of type '$1' and id '$2' with passives '$3'" ), }); this.setState({}); @@ -67,7 +67,7 @@ export default class TwacodeTester extends Component { className={ this.state.display_json_error ? Languages.t('scenes.app.popup.appsparameters.pages.error_user_code', [], 'erreur') - : Languages.t('scenes.app.popup.appsparameters.pages.ok_user_code', [], '') + : Languages.t('scenes.app.popup.appsparameters.pages.ok_user_code', [], 'ok') } onChange={evt => { try { diff --git a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceApps.js b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceApps.js index fc82437095..b2e0c83aaa 100755 --- a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceApps.js +++ b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceApps.js @@ -12,6 +12,7 @@ import EditIcon from '@material-ui/icons/MoreHorizOutlined'; import Switch from 'components/Inputs/Switch.js'; import WorkspaceUserRights from 'services/workspaces/workspace_user_rights.js'; import Button from 'components/Buttons/Button.js'; +import Icon from 'components/Icon/Icon.js'; import WorkspaceAppsEditor from './WorkspaceAppsEditor.js'; import Api from 'services/api.js'; @@ -58,7 +59,7 @@ export default class WorkspaceApps extends Component { Collections.get('applications').notify(); } - } + }, ); } @@ -73,7 +74,7 @@ export default class WorkspaceApps extends Component { text: Languages.t( 'scenes.app.popup.appsparameters.pages.button_force', [], - "Forcer dans toute l'entreprise" + "Forcer dans toute l'entreprise", ), onClick: () => { AlertManager.confirm(() => WorkspacesApps.forceInEntreprise(app.id)); @@ -88,7 +89,7 @@ export default class WorkspaceApps extends Component { label={Languages.t( 'scenes.app.popup.appsparameters.pages.automatique_label', [], - 'Automatique' + 'Automatique', )} value={ga.workspace_default} onChange={state => @@ -104,7 +105,7 @@ export default class WorkspaceApps extends Component { text: Languages.t( 'scenes.app.popup.appsparameters.pages.automatique_option_information', [], - "Si vous activez 'Automatique', cette application sera automatiquement ajoutée dans les prochains espaces de travail de cette entreprise." + "Si vous activez 'Automatique', cette application sera automatiquement ajoutée dans les prochains espaces de travail de cette entreprise.", ), }, { type: 'separator' }, @@ -116,7 +117,7 @@ export default class WorkspaceApps extends Component { text: Languages.t( 'scenes.app.popup.appsparameters.pages.remove_app_from_workspace', [], - "Supprimer de l'espace" + "Supprimer de l'espace", ), className: 'error', onClick: () => { @@ -130,7 +131,7 @@ export default class WorkspaceApps extends Component { text: Languages.t( 'scenes.app.popup.appsparameters.pages.remove_app_from_company', [], - "Supprimer de toute l'entreprise" + "Supprimer de toute l'entreprise", ), className: 'error', onClick: () => { @@ -165,10 +166,10 @@ export default class WorkspaceApps extends Component { .filter(item => item.available_categories); var workspaces_app_ids = Object.keys( - WorkspacesApps.apps_by_workspace[workspaceService.currentWorkspaceId] + WorkspacesApps.apps_by_workspace[workspaceService.currentWorkspaceId], ); var workspace_apps = workspaces_app_ids.map( - id => WorkspacesApps.apps_by_workspace[workspaceService.currentWorkspaceId][id] + id => WorkspacesApps.apps_by_workspace[workspaceService.currentWorkspaceId][id], ); var group_apps = Object.keys(WorkspacesApps.apps_by_group[workspaceService.currentGroupId]) .filter(id => workspaces_app_ids.indexOf(id) < 0) @@ -182,7 +183,7 @@ export default class WorkspaceApps extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.apps_title', [], - 'Vos applications et connecteurs' + 'Vos applications et connecteurs', )} @@ -192,7 +193,7 @@ export default class WorkspaceApps extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.developped_apps_subtitle', [], - "Applications développées par l'entreprise" + "Applications développées par l'entreprise", )} @@ -200,7 +201,7 @@ export default class WorkspaceApps extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.apps_connectors_small_text', [], - 'Créez et administrez vos applications et connecteurs.' + 'Créez et administrez vos applications et connecteurs.', )} @@ -215,7 +216,7 @@ export default class WorkspaceApps extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.current_informations_apps_connectors', [], - "Vous n'avez pas créé d'application pour le moment. Avant de créer une application ou un connecteur, vérifiez que celle-ci n'existe pas déjà dans notre marché d'applications." + "Vous n'avez pas créé d'application pour le moment. Avant de créer une application ou un connecteur, vérifiez que celle-ci n'existe pas déjà dans notre marché d'applications.", )} )} @@ -227,18 +228,16 @@ export default class WorkspaceApps extends Component { title: Languages.t( 'scenes.app.popup.appsparameters.pages.application_title', [], - 'Application' + 'Application', ), dataIndex: 'name', render: row => { return (
-
{row.name} ({row.app_group_name ? row.app_group_name + '.' : ''} @@ -252,7 +251,7 @@ export default class WorkspaceApps extends Component { title: Languages.t( 'scenes.app.popup.appsparameters.pages.status_tilte', [], - 'État' + 'État', ), width: 140, dataIndex: 'public', @@ -264,7 +263,7 @@ export default class WorkspaceApps extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.interne_availability_application', [], - 'Application interne' + 'Application interne', )}
)} @@ -273,7 +272,7 @@ export default class WorkspaceApps extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.waiting_availability_application', [], - 'En attente...' + 'En attente...', )}
)} @@ -282,7 +281,7 @@ export default class WorkspaceApps extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.public_availability_application', [], - 'Application publique' + 'Application publique', )}
)} @@ -294,7 +293,7 @@ export default class WorkspaceApps extends Component { title: Languages.t( 'scenes.app.popup.appsparameters.pages.installation', [], - 'Instal.' + 'Instal.', ), titleStyle: { textAlign: 'right' }, width: 60, @@ -321,7 +320,7 @@ export default class WorkspaceApps extends Component { value={Languages.t( 'scenes.app.popup.appsparameters.pages.show_button', [], - 'Afficher' + 'Afficher', )} style={{ marginTop: 0, width: 'auto' }} onClick={() => { @@ -342,7 +341,7 @@ export default class WorkspaceApps extends Component { value={Languages.t( 'scenes.app.popup.appsparameters.pages.create_app_button', [], - 'Créer une application' + 'Créer une application', )} onClick={() => { this.setState({ edit_app_id: 'new' }); diff --git a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsCreator.js b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsCreator.js index 3606840447..102411a00d 100755 --- a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsCreator.js +++ b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsCreator.js @@ -74,31 +74,23 @@ export default class WorkspaceAppsCreator extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.new_app_title', [], - 'Nouvelle application' + 'Nouvelle application', )}
-
- {' '} - {Languages.t( - 'scenes.app.popup.appsparameters.pages.creation_app_instruction', - [], - 'Veuillez confirmer les informations suivantes avant de créer votre application.' - )} -
-
{Languages.t( 'scenes.app.popup.appsparameters.pages.app_name_label', - 'Application name' + 'Application name', )}
- -
- {Languages.t( - 'scenes.app.popup.appsparameters.pages.app_surname', - [], - 'Nom simplifié de votre application' - )} -
-
- {Languages.t( - 'scenes.app.popup.appsparameters.pages.app_informations', - [], - "Cette chaine de caractère permet d'identifier votre application et sera utilisée dans les commandes de message." - )} -
- { - var simple = this.convertToSimpleName(ev.target.value); - this.state.new_app_simple_name_modified = - simple != this.convertToSimpleName(this.state.new_app_name); - this.setState({ new_app_simple_name: simple }); - }} - /> {this.state.error_simple_name && (
{Languages.t( 'scenes.app.popup.appsparameters.pages.error_message', [], - 'Ce nom est déjà utilisé par une autre application, veuillez en choisir un autre.' + 'Ce nom est déjà utilisé par une autre application, veuillez en choisir un autre.', )}
)} @@ -158,56 +119,17 @@ export default class WorkspaceAppsCreator extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.company_label', [], - 'Entreprise propriétaire' + 'Entreprise propriétaire', )}
{Languages.t( 'scenes.app.popup.appsparameters.pages.app_modification_right', [], - 'Tous les gérants de cette entreprise pourront modifier cette application.' - )} -
- - -
- {Languages.t( - 'scenes.app.popup.appsparameters.pages.user_grp_app', - [], - "Groupe d'applications (laisser vide si non utilisé)" - )} -
-
- {Languages.t( - 'scenes.app.popup.appsparameters.pages.information_grp_of_app', - [], - "Cette chaine de caractère permet de grouper cette application avec d'autres applications du même type." - )} -
- {Languages.t( - 'scenes.app.popup.appsparameters.pages.divided_connector', - [], - 'Si votre connecteur se divise en plusieurs modules optionnels, créez une application par module et regroupez les grâce à ce champ.' - )} -
-
-
- {' '} - {Languages.t( - 'scenes.app.popup.appsparameters.pages.warning_futur_modification', - [], - 'Attention, ce champ ne peut pas être modifié ultérieurement.' + 'Tous les gérants de cette entreprise pourront modifier cette application.', )}
- - this.setState({ new_app_group_name: this.convertToSimpleName(ev.target.value) }) - } - /> +

@@ -217,7 +139,7 @@ export default class WorkspaceAppsCreator extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.error_check_needed', [], - 'Une erreur est survenue, vérifiez vos informations.' + 'Une erreur est survenue, vérifiez vos informations.', )} )} @@ -236,7 +158,7 @@ export default class WorkspaceAppsCreator extends Component { value={Languages.t( 'scenes.app.popup.appsparameters.pages.create_my_app', [], - 'Créer mon application' + 'Créer mon application', )} disabled={this.state.loading} loading={this.state.loading} diff --git a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsEditor.js b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsEditor.js index 14370a9e86..3bea0856bc 100755 --- a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsEditor.js +++ b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsEditor.js @@ -12,10 +12,14 @@ import WorkspaceAppsCreator from './WorkspaceAppsCreator.js'; import Switch from 'components/Inputs/Switch.js'; import AutoHeight from 'components/AutoHeight/AutoHeight.js'; import TagPicker from 'components/TagPicker/TagPicker.js'; +import Icon from 'components/Icon/Icon.js'; import InputWithClipBoard from 'components/InputWithClipBoard/InputWithClipBoard.js'; import Input from 'components/Inputs/Input.js'; +import InlineTagPicker from 'app/components/InlineTagPicker/InlineTagPicker'; import './Pages.scss'; +import WorkspacesApp from 'services/workspaces/workspaces_apps.js'; +import WorkspaceApps from './WorkspaceApps.js'; export default class WorkspaceAppsEditor extends Component { constructor(props) { @@ -61,9 +65,9 @@ export default class WorkspaceAppsEditor extends Component { text: Languages.t( 'scenes.app.popup.appsparameters.pages.app_update', [this.state.application.name, this.state.application.install_count || 0], - "Mettre à jour l'application $1 (application est utilisée $2 fois.)" + "Mettre à jour l'application $1 (l'application est utilisée $2 fois.)" ), - } + }, ); } else { saveApp(); @@ -93,9 +97,9 @@ export default class WorkspaceAppsEditor extends Component { text: Languages.t( 'scenes.app.popup.appsparameters.pages.remove_app', [this.state.application.name], - "Supprimer l'application $1 définitivement." + "Supprimer l'application $1 définitivement.", ), - } + }, ); } @@ -111,7 +115,7 @@ export default class WorkspaceAppsEditor extends Component { render() { if (this.state.application.id != this.state.id) { this.state.application = JSON.parse( - JSON.stringify(Collections.get('applications').find(this.state.id) || {}) + JSON.stringify(Collections.get('applications').find(this.state.id) || {}), ); } @@ -138,19 +142,17 @@ export default class WorkspaceAppsEditor extends Component { return (
-
{application.name}
If you do not know how to fill these, go to{' '} - + the Twake API documentation {' '} ! @@ -162,7 +164,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.alert_published_app', [], - 'Votre application est publiée, vous ne pouvez pas la modifier.' + 'Votre application est publiée, vous ne pouvez pas la modifier.', )}
)} @@ -172,12 +174,12 @@ export default class WorkspaceAppsEditor extends Component { label={Languages.t( 'scenes.app.popup.appsparameters.pages._app_identity', [], - "Identité de l'application" + "Identité de l'application", )} description={Languages.t( 'scenes.app.popup.appsparameters.pages.modify_public_data', [], - 'Modifier les données publiques de votre application.' + 'Modifier les données publiques de votre application.', )} >
@@ -186,7 +188,7 @@ export default class WorkspaceAppsEditor extends Component { placeholder={Languages.t( 'scenes.app.popup.appsparameters.pages.amazing_app_name', [], - 'My amazing app' + 'My amazing app', )} type="text" disabled={this.state.loading || public_lock} @@ -201,14 +203,14 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.grp_section_surname_label', [], - 'Nom simplifié' + 'Nom simplifié', )}
{Languages.t( 'scenes.app.popup.appsparameters.pages.string_information', [], - "Cette chaine de caractère permet d'identifier votre application et sera utilisée dans les commandes de message." + "Cette chaine de caractère permet d'identifier votre application et sera utilisée dans les commandes de message.", )}
)}
- {Languages.t( - 'scenes.app.popup.appsparameters.pages.app_grp_label', - [], - "Groupe d'applications" - )} + {Languages.t('scenes.app.popup.appsparameters.pages.icon', 'icon')}
- - -
Icône
{Languages.t( 'scenes.app.popup.appsparameters.pages.optimal_format', [], - 'Format optimal : 48x48px.' + 'Format optimal : 48x48px.', )}
- -
- {Languages.t( - 'scenes.app.popup.appsparameters.pages.categories_label', - [], - 'Catégories' - )} -
{ @@ -327,12 +314,12 @@ export default class WorkspaceAppsEditor extends Component { label={Languages.t( 'scenes.app.popup.appsparameters.pages.api_parameters_label', [], - "Paramètres de l'API" + "Paramètres de l'API", )} description={Languages.t( 'scenes.app.popup.appsparameters.pages.api_data_description', [], - "Données utiles pour l'API Twake." + "Données utiles pour l'API Twake.", )} >
@@ -340,7 +327,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.public_login_label', [], - 'Identifiant public' + 'Identifiant public', )}
@@ -370,7 +357,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.url_reception_events_label', [], - 'Url de reception des évènements' + 'Url de reception des évènements', )}
{Languages.t( 'scenes.app.popup.appsparameters.pages.filter_information', [], - "Ce filtre permet de limiter l'utilisation de votre clé API aux serveurs de votre connecteur uniquement." + "Ce filtre permet de limiter l'utilisation de votre clé API aux serveurs de votre connecteur uniquement.", )}
{Languages.t( 'scenes.app.popup.appsparameters.pages.allowed_ip_adresses_method', [], - 'Utilisez * en développement pour autorisé toutes les adresses IP.' + 'Utilisez * en développement pour autorisé toutes les adresses IP.', )}
@@ -436,7 +423,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.configuration_label', [], - 'Configuration' + 'Configuration', )}
@@ -444,7 +431,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.json_configuration_information', [], - 'Rendez-vous sur la documentation afin de générer votre configuration au format JSON.' + 'Rendez-vous sur la documentation afin de générer votre configuration au format JSON.', )}
@@ -487,66 +474,40 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.write_privileges_label', [], - 'Privilèges en écriture' + 'Privilèges en écriture', )}
- { - return { name: item.id || item, id: item.id || item }; - })} - value={(application.capabilities || []).map(item => { - return { name: item.id || item, id: item.id || item }; - })} - onChange={values => { - application.capabilities = values.map(item => - typeof item == 'string' ? item : item.id - ); + { + application.capabilities = items; this.setState({}); }} /> -
{Languages.t( 'scenes.app.popup.appsparameters.pages.read_privileges_label', [], - 'Privilèges en lecture' + 'Privilèges en lecture', )}
- { - return { name: item.id || item, id: item.id || item }; - })} - value={(application.privileges || []).map(item => { - return { name: item.id || item, id: item.id || item }; - })} - onChange={values => { - application.privileges = values.map(item => - typeof item == 'string' ? item : item.id - ); + { + application.privileges = items; this.setState({}); }} /> -
Hooks
- { - return { name: item.id || item, id: item.id || item }; - })} - value={(application.hooks || []).map(item => { - return { name: item.id || item, id: item.id || item }; - })} - onChange={values => { - application.hooks = values.map(item => - typeof item == 'string' ? item : item.id - ); + { + application.hooks = items; this.setState({}); }} /> @@ -559,12 +520,12 @@ export default class WorkspaceAppsEditor extends Component { label={Languages.t( 'scenes.app.popup.appsparameters.pages.publication_label', [], - 'Publication' + 'Publication', )} description={Languages.t( 'scenes.app.popup.appsparameters.pages.publication_description', [], - 'Déterminez la visibilité de votre application.' + 'Déterminez la visibilité de votre application.', )} >
@@ -572,7 +533,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.parameters_form_small_text', [], - "L'application non publiée ne fonctionnera que dans votre entreprise, si vous souhaitez la rendre disponible à tous les utilisateurs de Twake activez cette option." + "L'application non publiée ne fonctionnera que dans votre entreprise, si vous souhaitez la rendre disponible à tous les utilisateurs de Twake activez cette option.", )}
@@ -582,7 +543,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.available_publication_alert', [], - 'La publication de votre application est actuellement en attente de validation par les équipes de Twake.' + 'La publication de votre application est actuellement en attente de validation par les équipes de Twake.', )}
)} @@ -591,7 +552,7 @@ export default class WorkspaceAppsEditor extends Component { label={Languages.t( 'scenes.app.popup.appsparameters.pages.publish_app_label', [], - "Publier l'application" + "Publier l'application", )} value={application.public} onChange={value => { @@ -608,12 +569,12 @@ export default class WorkspaceAppsEditor extends Component { label={Languages.t( 'scenes.app.popup.appsparameters.pages.danger_zone_label', [], - 'Zone dangereuse' + 'Zone dangereuse', )} description={Languages.t( 'scenes.app.popup.appsparameters.pages.danger_zone_description', [], - "Supprimez l'application." + "Supprimez l'application.", )} >
@@ -621,7 +582,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.danger_zone_small_text', [], - 'Vous ne pouvez pas supprimer cette application si elle est publiée.' + 'Vous ne pouvez pas supprimer cette application si elle est publiée.', )}
@@ -630,7 +591,7 @@ export default class WorkspaceAppsEditor extends Component { value={Languages.t( 'scenes.app.popup.appsparameters.pages.remove_app_button', [], - "Supprimer l'application" + "Supprimer l'application", )} disabled={this.state.loading || public_lock} loading={this.state.loading} @@ -647,7 +608,7 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.error_app_simple_name_message', [], - 'Le nom simplifié de votre application est déjà utilisé par une autre application, veuillez le changer.' + 'Le nom simplifié de votre application est déjà utilisé par une autre application, veuillez le changer.', )} )} @@ -657,14 +618,14 @@ export default class WorkspaceAppsEditor extends Component { {Languages.t( 'scenes.app.popup.appsparameters.pages.error_app_update_message', [], - "Une erreur s'est produite lors de la mise à jour de l'application." + "Une erreur s'est produite lors de la mise à jour de l'application.", )} )} { this.props.exit(); @@ -676,7 +637,7 @@ export default class WorkspaceAppsEditor extends Component { value={Languages.t( 'scenes.app.popup.appsparameters.pages.update_button', [], - 'Mettre à jour' + 'Mettre à jour', )} disabled={this.state.loading} loading={this.state.loading} diff --git a/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsInformations.js b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsInformations.js new file mode 100644 index 0000000000..254ee1a1e9 --- /dev/null +++ b/twake/frontend/src/app/scenes/App/Popup/AppsParameters/Pages/WorkspaceAppsInformations.js @@ -0,0 +1,54 @@ +import React, { Component } from 'react'; + +import Languages from 'services/languages/languages.js'; +import InputWithClipBoard from 'components/InputWithClipBoard/InputWithClipBoard.js'; +import workspaceService from 'services/workspaces/workspaces.js'; +import userService from 'services/user/user.js'; +import './Pages.scss'; + +export default class WorkspaceAppsInformations extends Component { + render() { + return ( +
+
+ {Languages.t( + 'scenes.app.popup.appsparameters.pages.title_informations', + 'Basic informations', + )} +
+
+
+ {Languages.t( + 'scenes.app.popup.appsparameters.pages.subtitle_informations', + 'Informations related to applications management', + )} +
+ +
+ {Languages.t( + 'scenes.app.popup.appsparameters.pages.smalltext_user_id', + 'Current user id', + )} +
+ + +
+ {Languages.t( + 'scenes.app.popup.appsparameters.pages.smalltext_workspace_id', + 'Current workspace id', + )} +
+ + +
+ {Languages.t( + 'scenes.app.popup.appsparameters.pages.smalltext_group_id', + 'Current group id', + )} +
+ +
+
+ ); + } +} diff --git a/twake/frontend/src/app/scenes/App/Popup/UserParameter/UserParameter.js b/twake/frontend/src/app/scenes/App/Popup/UserParameter/UserParameter.js index dd308dec9b..f7e67f4852 100755 --- a/twake/frontend/src/app/scenes/App/Popup/UserParameter/UserParameter.js +++ b/twake/frontend/src/app/scenes/App/Popup/UserParameter/UserParameter.js @@ -212,7 +212,7 @@ export default class UserParameter extends Component { - + diff --git a/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceApps.js b/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceApps.js index 219a80a6d1..2d8a4c1300 100755 --- a/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceApps.js +++ b/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceApps.js @@ -21,6 +21,7 @@ import WorkspaceAppsSearch from './WorkspaceAppsSearch.js'; import Loader from 'components/Loader/Loader.js'; import './Pages.scss'; +import Icon from 'components/Icon/Icon.js'; export default class WorkspaceApps extends Component { constructor(props) { @@ -216,14 +217,13 @@ export default class WorkspaceApps extends Component { title: 'Application', dataIndex: 'name', render: row => { + var icon = row.icon_url; return (
-
{row.name} ({row.app_group_name ? row.app_group_name + '.' : ''} @@ -397,16 +397,10 @@ export default class WorkspaceApps extends Component {
0} - label={Languages.t( - 'scenes.app.popup.workspaceparameter.pages.your_apps_label', - [], - 'Vos applications', - )} + autoOpen={true} description={Languages.t( - 'scenes.app.popup.workspaceparameter.pages.your_apps_description', - [], - 'Créez et administrez vos applications et connecteurs.', + 'scenes.app.popup.appsparameters.pages.apps_connectors_small_text', + 'Gérer vos applications et connecteurs.', )} >
diff --git a/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceAppsSearch.js b/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceAppsSearch.js index fcf0219c34..40352e52b0 100755 --- a/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceAppsSearch.js +++ b/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceAppsSearch.js @@ -10,6 +10,7 @@ import InputIcon from 'components/Inputs/InputIcon.js'; import PseudoMarkdownCompiler from 'services/Twacode/pseudoMarkdownCompiler.js'; import TagPicker from 'components/TagPicker/TagPicker.js'; import WorkspacesApps from 'services/workspaces/workspaces_apps.js'; +import Icon from 'components/Icon/Icon.js'; import './Pages.scss'; @@ -63,11 +64,10 @@ export default class WorkspaceAppsSearch extends Component { return list.map(item => { return (
-
diff --git a/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceIdentity.js b/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceIdentity.js index 4bbcbdbc51..337de83f94 100755 --- a/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceIdentity.js +++ b/twake/frontend/src/app/scenes/App/Popup/WorkspaceParameter/Pages/WorkspaceIdentity.js @@ -178,7 +178,7 @@ export default class WorkspaceIdentity extends Component { }} > {Languages.t( - 'scenes.app.popup.workspaceparameter.pages.remove_button', + 'general.delete', [], 'Supprimer' )} diff --git a/twake/frontend/src/app/scenes/App/WorkspacesBar/Components/Group.js b/twake/frontend/src/app/scenes/App/WorkspacesBar/Components/Group.js index 7851a55529..a704a952f9 100755 --- a/twake/frontend/src/app/scenes/App/WorkspacesBar/Components/Group.js +++ b/twake/frontend/src/app/scenes/App/WorkspacesBar/Components/Group.js @@ -71,7 +71,7 @@ export default class Group extends Component { text: Languages.t( 'scenes.app.workspacesbar.components.change_company_title', [], - 'Changer de company' + 'Change company', ), }); Groups.getOrderedGroups().map(item => { @@ -82,7 +82,7 @@ export default class Group extends Component { text: Languages.t( 'scenes.app.workspacesbar.components.create_company_menu', [], - 'Créer une entreprise' + 'Créer une entreprise', ), icon: 'plus', onClick: () => { @@ -96,7 +96,7 @@ export default class Group extends Component { text: Languages.t( 'scenes.app.workspacesbar.components.grp_parameters', [group.name], - 'Paramètres de $1' + 'Paramètres de $1', ), onClick: () => { popupManager.open(, true, 'workspace_parameters'); diff --git a/twake/frontend/src/app/scenes/Apps/Calendar/Calendar.js b/twake/frontend/src/app/scenes/Apps/Calendar/Calendar.js index 5de74812ae..4946620d01 100755 --- a/twake/frontend/src/app/scenes/Apps/Calendar/Calendar.js +++ b/twake/frontend/src/app/scenes/Apps/Calendar/Calendar.js @@ -271,7 +271,7 @@ export default class Calendar extends Component { { type: 'menu', className: 'error', - text: Languages.t('scenes.apps.calendar.remove_calendar_menu', [], 'Supprimer'), + text: Languages.t('general.delete', [], 'Supprimer'), onClick: () => { AlertManager.confirm( () => { diff --git a/twake/frontend/src/app/scenes/Apps/Calendar/Modals/CalendarEditor.js b/twake/frontend/src/app/scenes/Apps/Calendar/Modals/CalendarEditor.js index 5ede5474b6..41eb9aa742 100755 --- a/twake/frontend/src/app/scenes/Apps/Calendar/Modals/CalendarEditor.js +++ b/twake/frontend/src/app/scenes/Apps/Calendar/Modals/CalendarEditor.js @@ -47,8 +47,8 @@ export default class CalendarEditor extends Component { type="button" value={ this.state.calendar.id - ? Languages.t('scenes.apps.calendar.modals.save_button', [], 'Enregistrer') - : Languages.t('scenes.apps.calendar.modals.add_button', [], 'Ajouter') + ? Languages.t('general.save', [], 'Enregistrer') + : Languages.t('general.add', [], 'Ajouter') } onClick={() => this.save()} /> diff --git a/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventCreation.js b/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventCreation.js index 6f0dfca395..1bbd2241a1 100755 --- a/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventCreation.js +++ b/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventCreation.js @@ -183,7 +183,7 @@ export default class EventCreation extends Component { this.save(); }} > - {Languages.t('scenes.apps.calendar.modals.save_button', [], 'Enregistrer')} + {Languages.t('general.save', [], 'Enregistrer')}
); diff --git a/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventModification.js b/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventModification.js index 933f9611d2..5cfaa2bab5 100755 --- a/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventModification.js +++ b/twake/frontend/src/app/scenes/Apps/Calendar/Modals/EventModification.js @@ -227,7 +227,7 @@ export default class EventModification extends Component { this.save(); }} > - {Languages.t('scenes.apps.calendar.modals.save_event_button', [], 'Enregistrer')} + {Languages.t('general.save', [], 'Enregistrer')}
diff --git a/twake/frontend/src/app/scenes/Apps/Drive/PathElement.js b/twake/frontend/src/app/scenes/Apps/Drive/PathElement.js index 8776dc98bc..2236613c65 100755 --- a/twake/frontend/src/app/scenes/Apps/Drive/PathElement.js +++ b/twake/frontend/src/app/scenes/Apps/Drive/PathElement.js @@ -7,6 +7,7 @@ import DriveService from 'services/Apps/Drive/Drive.js'; import SelectionsManager from 'services/SelectionsManager/SelectionsManager.js'; import Collections from 'services/Collections/Collections.js'; import Emojione from 'components/Emojione/Emojione.js'; +import Languages from 'services/languages/languages.js'; export default class PathElement extends DriveElement { dropFile(data, directory) { @@ -86,7 +87,7 @@ export default class PathElement extends DriveElement { {directory.parent_id && directory.parent_id != 'trash' ? directory.name : this.props.inTrash - ? 'Trash' + ? Languages.t('scenes.apps.drive.trash', [], 'Trash') : workspace.name} {directory.application_id && app.name && ({app.name})} diff --git a/twake/frontend/src/app/scenes/Apps/Messages/Message/Message.js b/twake/frontend/src/app/scenes/Apps/Messages/Message/Message.js index 7ad7cbc074..136eece80f 100755 --- a/twake/frontend/src/app/scenes/Apps/Messages/Message/Message.js +++ b/twake/frontend/src/app/scenes/Apps/Messages/Message/Message.js @@ -169,13 +169,15 @@ export default class Message extends Component { var isFirstNewMessage = this.props.message.creation_date > this.props.unreadAfter; + const creation_date = Math.min(new Date().getTime(), this.props.message.creation_date * 1000); + var show_user = isFirstNewMessage || this.props.previousMessage.sender != this.props.message.sender || this.props.previousMessage.sender == null || this.props.message.responses_count > 0 || this.props.previousMessage.responses_count > 0 || - this.props.message.creation_date - this.props.previousMessage.creation_date > 60 * 5 || //5 minutes + creation_date / 1000 - this.props.previousMessage.creation_date > 60 * 5 || //5 minutes this.props.message.pinned; var canDropIn = !this.props.isResponse; var canDrag = true; @@ -299,8 +301,16 @@ export default class Message extends Component { )} {!this.props.message._user_ephemeral && (
- - {this.props.message.creation_date * 1000} + new Date().getTime() - 1000 * 60 * 60 * 12 + ? 'h:mm a' + : 'h:mm a, MMM D' + } + style={{ marginLeft: 5 }} + > + {creation_date}
)} @@ -385,7 +395,7 @@ export default class Message extends Component { />
@@ -455,25 +455,11 @@ export default class MessagesList extends Component { (!m.id && Mlist.states[this.key].visible_max_id == Mlist.states[this.key].max_id) || (m.id && Numbers.compareTimeuuid(m.id, Mlist.states[this.key].visible_min_id) >= 0 && - Numbers.compareTimeuuid(m.id, Mlist.states[this.key].visible_max_id) <= 0) + Numbers.compareTimeuuid(m.id, Mlist.states[this.key].visible_max_id) <= 0), ) .filter(message => !message._user_ephemeral) .sort((a, b) => a.creation_date - b.creation_date); - /* - if (this.props.parentMessageId) { - console.log('rerender list ' + this.props.parentMessageId); - console.log( - Collections.get('messages').findBy({ - channel_id: this.props.channel.id, - parent_message_id: this.props.parentMessageId, - _user_ephemeral: undefined, - }), - ); - console.log(messages); - console.log(Mlist.states[this.key]); - }*/ - //Auto scroll to searched or requested message var scroll_to_key = this.props.channel.id + '_' + (this.props.parentMessageId || ''); if ( @@ -521,9 +507,9 @@ export default class MessagesList extends Component { }} > {Languages.t( - 'scenes.apps.messages.messageslist.load_before—button', + 'scenes.apps.messages.messageslist.load_before_button', [], - 'Charger avant' + 'Charger avant', )} )} @@ -564,7 +550,7 @@ export default class MessagesList extends Component { {Languages.t( 'scenes.apps.messages.messageslist.load_after_button', [], - 'Charger après' + 'Charger après', )} , , ]} @@ -603,7 +589,7 @@ export default class MessagesList extends Component { backgroundImage: "url('" + UserService.getThumbnail( - Collections.get('users').find(this.state.last_message.sender) + Collections.get('users').find(this.state.last_message.sender), ) + "')", }} @@ -612,8 +598,8 @@ export default class MessagesList extends Component { {PseudoMarkdownCompiler.compileToSimpleHTML( MessagesService.prepareContent( this.state.last_message.content, - this.state.last_message.user_specific_content - ) + this.state.last_message.user_specific_content, + ), )}
)} diff --git a/twake/frontend/src/app/scenes/Apps/Tasks/Board/List/AddTask.js b/twake/frontend/src/app/scenes/Apps/Tasks/Board/List/AddTask.js index 53f2e0625e..b69b3b9336 100755 --- a/twake/frontend/src/app/scenes/Apps/Tasks/Board/List/AddTask.js +++ b/twake/frontend/src/app/scenes/Apps/Tasks/Board/List/AddTask.js @@ -53,7 +53,7 @@ export default class AddTask extends React.Component { { this.setState({ new_task_title: evt.target.value }); @@ -64,7 +64,7 @@ export default class AddTask extends React.Component { />