Compare commits

..

266 Commits

Author SHA1 Message Date
Tim Abbott
ac24fdd4eb Release Zulip Server 2.0.0. 2019-03-01 10:32:10 -08:00
Steve Howell
3fc2a43573 node tests: Fix recent build break.
This is a one-line fix for the new CSS class
we're using for "away".
2019-03-01 10:07:38 -08:00
Boris Yankov
31536a48ef user status: Add icon for "unavailable".
Fixes #11589.

Adds SCSS style for the "unavailable" user status and enables its
usage in `buddy_data.js`.

The style is a red circle with a horizontal line. The values might
look a bit 'magic' but they were considered carefully ` height` of
1px was too thin, 2px was too thick, thus 1.5px was chosen.
2019-03-01 09:56:09 -08:00
Tim Abbott
beec029324 docs: Fix a typo in last update. 2019-03-01 09:33:12 -08:00
Tim Abbott
f450a5ceaa i18n: Update translation data from Transifex. 2019-03-01 09:28:08 -08:00
Tim Abbott
9693d8a651 docs: Extend testing discussion in events system doc.
Importantly, this also makes that section linkable.
2019-03-01 09:23:56 -08:00
Rishi Gupta
2c0b291902 portico: Add ninth logo to /for/open-source testimonial section. 2019-03-01 09:12:50 -08:00
Rishi Gupta
f8c8b41ad8 portico: Fix media parameters for hiding last testimonial logo.
Tested both /hello and /for/open-source.
2019-03-01 09:12:50 -08:00
Eeshan Garg
9252c43225 api/streams: Support including bot owner's subscriptions.
This is important for situations such as with our Zapier app,
where the requesting user may be a bot that would like to access
its owner's subscriptions.

Tweaked by tabbott to eliminate the 2^N growth of cases in
do_get_streams.
2019-02-28 22:32:05 -08:00
Eeshan Garg
85f453998e webhooks/zapier: Remove code related to our official Zapier app.
Our official Zapier app now uses our JS bindings (zulip-js) to
call the API directly and doesn't need to go through the webhook
anymore for anything.
2019-02-28 22:09:35 -08:00
Raymond Akornor
4603cdba7e tests: Optimize a slow test in tests_bots.py.
tests now ran in 7.649s from 9.297s.  And this test works just as well
with 3 bots, since only 3 database queries with 3 bots confirms we're
not doing linear queries in the number of bots in the organization.
2019-02-28 22:01:55 -08:00
Rishi Gupta
48eb0c2358 help: Update start-a-call to include Hangouts and Zoom. 2019-02-28 17:11:27 -08:00
Rishi Gupta
9357e17b93 help: Add private-messages. 2019-02-28 17:11:27 -08:00
Rishi Gupta
812f62c8b3 help: Add user-groups. 2019-02-28 17:11:27 -08:00
Rishi Gupta
1871d00bb2 help: Update at-mention-a-user to include user groups.
Also changes the terminology for this feature from at-mention to
mention.
2019-02-28 17:11:27 -08:00
Tim Abbott
de65a04ae0 streams: Disable inline URL preview when rendering stream descriptions.
We want to use the baseline features of bugdown, but not fancy things
like inline URL previews, since the whole structure of stream
descriptions is to have a single-line thing supporting some
formatting.

The migration part of this change fixes a bug encountered by some
organizations upgrading from older versions of Zulip.
2019-02-28 17:00:40 -08:00
Tim Abbott
d6c09eac51 bugdown: Add support for no_previews argument.
This allows us to have some features using bugdown rendering where
inline image previews will not be rendered (which would be problematic
for e.g. stream descriptions).
2019-02-28 16:54:04 -08:00
Tim Abbott
62dc6dda49 guests: Block guest user access to default streams.
Guest users will just get an empty list of default streams; we also
hide the "Default streams" organization view from the guest users UI.

This is for consistency with not providing guest users the full list
of streams in an organization.
2019-02-28 16:36:30 -08:00
Tim Abbott
1ce0e8256b zoom: Avoid sending Zoom API secret to other admin clients.
Fixing this involves fixing the backend to handle unchanged field
submissions of the Zoom credentials without trying to re-validate the
credentials (for performance) as well as to fetch the already-sent
secret.
2019-02-28 15:43:42 -08:00
Tim Abbott
0a0ac24d62 settings: Disable autocomplete on various text fields.
This prevents browser autocomplete from annoying trying to insert
values into these settings fields.
2019-02-28 15:39:34 -08:00
Tim Abbott
7fb0122ab3 settings: Fix weird live update when saving zoom form.
Previously, we would reset the state of the form to what it was before
the current change just after saving.
2019-02-28 15:39:34 -08:00
Rishi Gupta
d833c70dc7 org settings: Explain Zoom support is experimental, and fix a few strings.
Visually, #zoom_help_text acts like
.organization-settings-parent div:first-of-type when the Zoom option
is selected, but isn't treated as such.

No visual change with the #google_hangouts_domain change; just there to make
the code more readable/defensible.
2019-02-28 15:09:35 -08:00
Anders Kaseorg
88e90d34b9 try_git_describe: Set cwd, not --git-dir.
git describe --dirty requires a working tree, not just a repository.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-28 14:59:33 -08:00
Rishi Gupta
9962377018 analytics: Fix midnight-related bug in test.
Previously, this would flake if the day changed between
user2 = do_create_user('email2', 'password', ...) and
do_deactivate_user(user2).
2019-02-28 14:48:30 -08:00
Rishi Gupta
5692acdf04 help: Update delete-a-topic. 2019-02-28 14:48:07 -08:00
Rishi Gupta
dbb4817128 help: Rename make-a-user-an-administrator to include guests. 2019-02-28 14:48:07 -08:00
Rishi Gupta
1730a9b355 help: Make it clearer that guests can see other members. 2019-02-28 14:48:07 -08:00
Rishi Gupta
ddad11c43a help: Add silent mentions to format-your-messages-using-markdown. 2019-02-28 14:48:07 -08:00
Rishi Gupta
e1f091f724 help: Add missing link to moderating-open-organizations. 2019-02-28 14:48:07 -08:00
Rishi Gupta
35af34049b help: Add announcement-only-streams.md. 2019-02-28 14:48:07 -08:00
Rishi Gupta
59f7e7d346 help: Add Room to about-streams-and-topics table. 2019-02-28 14:48:07 -08:00
Rishi Gupta
8e503c9ac7 help: Add a few topic-related tips for administrators. 2019-02-28 14:48:07 -08:00
Rishi Gupta
58829b7646 help: Add start-a-new-topic. 2019-02-28 14:48:07 -08:00
varunvaruns9
6725d921ac popovers: Fix toggling of user popover.
Fix the logic for closing user popover on clicking
the chevron again in the buddy list.

Fixes: #11690.
2019-02-28 14:45:16 -08:00
Anders Kaseorg
c6e60ebf0e backup: Set cwd while running pg_dump.
This avoids a spurious permission error inside the Postgres
`resolve_symlinks` function if we don’t have access to the current
working directory (e.g. we’re running with cwd /root inside `su
zulip`).

While we’re here, add a defensive `--` argument.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-28 14:40:28 -08:00
Tim Abbott
bc3b864754 export: Add a bunch of comments to our export tool. 2019-02-28 12:20:08 -08:00
Tim Abbott
de6f724bc5 middleware: Avoid doing work for statsd when not enabled.
This saves about 8% of the runtime of our total response middleware,
or equivalently close to 2% of the total Tornado response time.  Which
is pretty significant given that we're not sure anyone is using statsd
in production.

It's also useful outside Tornado, but the effect is particularly
significant because of how important Tornado performance is.
2019-02-27 17:53:15 -08:00
Tim Abbott
c955b20131 middleware: Don't repreatedly regenerate open graph functions.
This avoids parsing these functions on every request, which was
adding roughly 350us to our per-request response times.

The overall impact was more than 10% of basic Tornado response
runtime.
2019-02-27 17:53:13 -08:00
Tim Abbott
42a5dc2649 requirements: Add line_profiler.
This library is super useful for doing line-by-line profiling of code
paths that we want to be really fast.
2019-02-27 17:48:49 -08:00
Tim Abbott
f289801d23 requirements: Update Django to latest security release. 2019-02-27 17:02:02 -08:00
Tim Abbott
ab95704d2d settings: Fix mismatch of templates with JavaScript.
The alignment between the "Organization settings" code/labels and the
actual logic was broken in 65f6bea7d7
and the related commits.
2019-02-27 16:18:36 -08:00
Tim Abbott
7717337b1e message_edit: Fix rendering bug when topic-editing single messages.
If you topic-edited a single message within a narrow, we would update
all our unreads/sidebar/etc. data structures, and would rerender the
message if appropriate.  However, for the corner case of being inside
a topic narrow when you did this, we didn't have logic to remove the
message from the narrow (which is the appropriate situation when you
just topic-edited a message in a narrow).

When topic-editing multiple messages including the currently selected
message (the more common case), we would end up changing the narrow,
resulting in this issue being masked.

Fixes #11601.
2019-02-27 13:57:45 -08:00
Tim Abbott
da043f163d Revert "docs: Add Zulip logo to ReadTheDocs heading."
This reverts commit 579e2e8b2b.
2019-02-27 13:31:44 -08:00
Tim Abbott
60f33a374d streams: Fix announcement-only option being hidden.
Fixes an unpleasant regression in
746870df65.
2019-02-27 13:29:45 -08:00
Tim Abbott
f40cbdbd19 compose: Fix extra space being added by quote-and-reply.
The correct behavior here is that we want to ensure there is
whitespace in between the syntax being added and the content on either
side.  Our smart_insert logic handled this for the cases that were
common with inserting emoji (etc.), but didn't handle the more complex
cases with "quote and reply".

Fixes #11702.
2019-02-27 13:22:25 -08:00
Samuel Searles-Bryant
579e2e8b2b docs: Add Zulip logo to ReadTheDocs heading.
Add the Zulip logo to the docs that will appear on readthedocs.
Also remove the house logo and "Zulip" text that appear above the logo.

Fixes: #11700.
2019-02-27 12:54:40 -08:00
Steve Howell
7cbee8af5b left-sidebar: Fix title tag for "Private messages".
The title tag should be over the text, not the
entire list item.  This prevents strange hovers
for sublist items like the new green/orange
circles.
2019-02-27 12:20:05 -08:00
Steve Howell
b57c9a85d5 left-sidebar: Remove unused hover-underline class.
The CSS for this was removed in
953ee778f3.
2019-02-27 12:19:31 -08:00
Paurakh Sharma Humagain
e9131b031b docs: Make the vagrant guide clone steps pasteable.
After the user clones Zulip they should first get inside the directory
before adding the remote upstream.

Tweaked by tabbott to make a bit simpler.
2019-02-27 12:09:09 -08:00
Tim Abbott
cefebd87a4 docs: Mention bug in ALWAYS_SEND_ALL_HOTSPOTS feature.
This should avoid some wasted time.
2019-02-27 10:21:30 -08:00
Mohit Gupta
70d54b5a5a compose: Add shortcut hint to New topic and New stream message button.
Fixes: #11678.
2019-02-27 10:05:50 -08:00
Rishi Gupta
6d51b25fc6 help: Rework docs for joining and inviting. 2019-02-27 09:33:37 -08:00
Rishi Gupta
b67709a1c8 help: Update explanation of closed compose box in open-the-compose-box. 2019-02-27 09:29:37 -08:00
Rishi Gupta
ac6f628c44 help: Rework Navigation and unread counts content. 2019-02-26 22:48:04 -08:00
Tim Abbott
216d2ec1bf production: Add optional support for submitting usage statistics.
See documentation for details.
2019-02-26 17:35:10 -08:00
Greg Price
de2f1ee0c4 push notif: Make O(1) database queries in handle_remove_... 2019-02-26 16:41:55 -08:00
Greg Price
b0a84cd7ab message: Add an O(1)-query variant of bulk_access_messages.
We'll use this in the push-notifications code, in a context where
there should definitely already be UserMessage rows if everything's
gone normally... but explicitly checking at the top seems like the
right pattern from a secure-coding perspective.
2019-02-26 16:41:54 -08:00
Greg Price
9869153ae8 push notif: Send a batch of message IDs in one remove payload.
When a bunch of messages with active notifications are all read at
once -- e.g. by the user choosing to mark all messages, or all in a
stream, as read, or just scrolling quickly through a PM conversation
-- there can be a large batch of this information to convey.  Doing it
in a single GCM/FCM message is better for server congestion, and for
the device's battery.

The corresponding client-side logic is in zulip/zulip-mobile#3343 .

Existing clients today only understand one message ID at a time; so
accommodate them by sending individual GCM/FCM messages up to an
arbitrary threshold, with the rest only as a batch.

Also add an explicit test for this logic.  The existing tests
that happen to cause this function to run don't exercise the
last condition, so without a new test `--coverage` complains.
2019-02-26 16:41:54 -08:00
Greg Price
28ff9670de push notif: Push gcm_options logic inside "payload" helpers.
These are logically closely related.
2019-02-26 16:41:54 -08:00
Greg Price
8f26e12c85 push notif: Clarify get_*_payload, and factor another out.
This is a pure refactor; adding docstrings, making some names more
explicit, and pulling out one small helper.
2019-02-26 16:41:54 -08:00
Greg Price
69ded8b1b4 push notif: Drop irrelevant fields in remove payloads.
These fields don't make much sense in this case; and the client
doesn't look at them and never has.  Stop including them.
2019-02-26 16:41:54 -08:00
Tim Abbott
9fec2a1e2a i18n: Update translation data from Transifex. 2019-02-26 16:35:27 -08:00
Wyatt Hoodes
5231b27dea popovers: Add a clear status option in user popover.
Accomplished by adding a function to clear the status message with
an empty string. The html is then updated to reflect changes without a
refresh.

Currently, it's a small hassle to clear a status message.  This option
makes things a bit easier.

Fixes #11630.
2019-02-26 14:40:17 -08:00
Steve Howell
3697add70c settings: Reset scroll when switching sections. 2019-02-26 14:26:15 -08:00
Anders Kaseorg
c6da0d13cd docs: Update links to skip help.github.com redirects.
help.github.com seems to have a bug where HEAD on a redirected page
returns 404.  This causes tools/test-documentation to fail.  Fix it by
skipping the redirects.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-26 11:03:08 -08:00
Tim Abbott
f096472b1d Revert "condense/collapse: Fix MLV to update for new messages."
This reverts commit a6793a14f1.

This was causing weird 0-height display issues.
2019-02-26 10:40:31 -08:00
Steve Howell
bca38200a8 message_store: Add an each helper.
This new helper allows us to do the same operation
on every message in our message_store.  We will
use this in a future commit to clear the `is_tall`
flags on all messages, after a resize.

We should be somewhat cautious about using this,
but simple operations should be really fast, even
if you have lots of messages in the store.
2019-02-25 21:12:07 +00:00
Steve Howell
a6793a14f1 condense/collapse: Fix MLV to update for new messages. 2019-02-25 21:12:07 +00:00
Tim Abbott
cd0db08b14 lint: Fix a too-long line. 2019-02-25 10:06:37 -08:00
Tim Abbott
cc8021a742 message_list: Fix focus issues when editing last message.
Previously, if you were in the process of editing the last message in
a narrow and a new message came in, we'd rerender that second-to-last
message, causing your editing widget to lose focus (and thus the next
few keys you typed to be interpreted as keyboard shortcuts, which
had a good chance of resulting in your navigating somewhere random).

This rerendering was essentially unnecessary; the only change to state
going into the rendering process was the next_is_same_sender CSS class
being toggled on the messagebox in the message.  So, at most, we
should have been just toggling that CSS class (and this commit makes
us do precisely that).

It seems like we could further improve this code by just removing the
next_is_same_sender CSS class entirely and removing this block, but
I'm leaving that for follow-up work.

Fixes #11656.
2019-02-25 10:03:49 -08:00
overide
93f9082071 left sidebar: Fix closing stream search.
This fixes an issue where closing stream search was not working if
user had not entered a search term and tried to close the search box
by clicking on the close icon; the problem was that we'd end up
re-opening the widget immediately after through event propagation.

Fixes: #11636.
2019-02-25 09:47:44 -08:00
Tim Abbott
7312189be0 message_edit: Fix compose icons appearing for topic-editable messages.
The is_editable field includes topic edits, so we need a separate
field for whether to display these icons which are all for content
editing.

Fixes #11666.
2019-02-24 11:29:37 -08:00
Tim Abbott
094dcac2dc message_edit: Fix content editing icons appearing in "view source".
These icons was misplaced during a recent refactoring, resulting in
the compose icons appearing even for non-editable messages.

Fixes part of #11666.
2019-02-24 11:29:07 -08:00
synicalsyntax
db37192857 integrations: Rename Google logo to bypass Adblock Plus.
Adblock Plus's "Block social media icons tracking" setting blocks
images with for social media platforms in their names from loading, so
we rename the Google logo to bypass this.
2019-02-24 11:09:02 -08:00
synicalsyntax
33bd52388a integrations: Rename social media logos to bypass Adblock Plus.
Adblock Plus's "Block social media icons tracking" setting blocked
integration logos for social media platforms from loading, so the logos
are renamed to bypass this.

Fixes #11590.
2019-02-23 10:56:43 -08:00
synicalsyntax
d6483a99d0 integrations: Update xkcd logo. 2019-02-22 18:16:29 -08:00
synicalsyntax
ec866844ac integrations: Update Matrix logo. 2019-02-22 18:16:29 -08:00
synicalsyntax
26d92b422f integrations: Improve resolution of IRC logo. 2019-02-22 18:16:29 -08:00
Anders Kaseorg
9faa009f66 lint: Prohibit unused imports.
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-22 16:54:50 -08:00
Anders Kaseorg
f1ec67c614 python: Mark intentionally unused imports with noop statements.
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-22 16:54:47 -08:00
Anders Kaseorg
649235cfec python: Remove unused imports.
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-22 16:54:36 -08:00
Eeshan Garg
8821b5a903 webhooks/pagerduty: Account for missing trigger summary data.
Some incoming payloads do not include details such as the trigger's
summary and description.
2019-02-22 15:59:28 -08:00
Eeshan Garg
912931e1bc webhooks/trello: Support updateCheckItemStateOnCard events. 2019-02-22 15:59:28 -08:00
Eeshan Garg
788dd48c93 webhooks/trello: Ignore createCheckItem events.
Notifications for every check item that is added to a card's
check list would be too noisy.
2019-02-22 15:59:28 -08:00
Eeshan Garg
9af2aa5566 webhooks/trello: Recommend wrapping webhook URL in quotes.
The ampersand in the query string of a URL can confuse bash,
leading to situations where anything in the URL beyond the
ampersand isn't parsed.
2019-02-22 15:59:28 -08:00
Anders Kaseorg
1e2bd553fb setup-certbot: Remove --force-renewal. (#11652)
There’s no reason to do this unless you’re, like, trying to trip the
Let’s Encrypt rate limits (or perhaps trying to manually test this code).

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-22 15:50:38 -08:00
Rishi Gupta
2d5a33225a help: Fix typo in getting-your-org-started-with-zulip. 2019-02-22 15:21:46 -08:00
Rishi Gupta
e61202387e help: Fix duplicated link in getting-your-org-started-with-zulip.
Fixes: #11635
2019-02-22 15:19:42 -08:00
Challa Venkata Raghava Reddy
e7fb19c8b0 invitations: Fix email validation errors for deactivated accounts.
This provides a much clearer error message when trying to invite a
user who has a deactivated account.

Fixes part of #8144.
2019-02-22 14:27:22 -08:00
Rohitt Vashishtha
62007d3e38 compose: Do not show compose-invite-users row for silent mentions. 2019-02-22 13:17:47 -08:00
Rohitt Vashishtha
c504fa98aa typeahead: Show only users in silent mentions typeahead. 2019-02-22 13:17:47 -08:00
Vaibhav
69c16ab90d messagebox: Change alert message background to dark in night mode.
When copying a message by clicking on "copy and close" button in
message edit box an alert appears that says "Copied!"; Background
of the message is set corresponding with the day mode but not the
night mode. This changes the background of the alert message to
the dark color in night mode.
2019-02-22 13:12:00 -08:00
Puneeth Chaganti
b8e25677ef digest: Remove unnecessary scroll bar for private messages. 2019-02-22 13:09:26 -08:00
Priyanshu Singh
e328671f20 docs: Fix a typo in the-git-difference.md.
Fix a small typing error, correcting 'has' to 'hash'.
2019-02-22 13:01:45 -08:00
Anders Kaseorg
ce2474c0ad css: Fix unread marker gap in night mode.
Instead of drawing a white border between unread markers, leave a real
space.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-22 13:01:03 -08:00
Rishi Gupta
51a8748d23 features: Advertise integrations with IRC, Matrix, and Slack. 2019-02-21 16:36:45 -08:00
Rishi Gupta
be9d1b5411 features: Rename Presence and Branding. 2019-02-21 16:36:23 -08:00
Rohitt Vashishtha
185da99ccb typeahead: Fix accidental overwrite of message content on select.
Also adds tests to ensure that we do not accidentally overwrite
the 'beginning' variable that contains the message content upto
that point. These should prevent similar errors in the future.

The bug was added in 8119258c4d.
2019-02-21 11:34:51 -08:00
Tim Abbott
5e96f53948 realm_logo: Display with target background, not current background.
This makes it a lot more clear what this feature will look like.
2019-02-20 18:04:04 -08:00
Tim Abbott
4df8a2ac0f settings: Fix handling of day logo without night logo.
In this case, we should just use the day logo for both themes.
2019-02-20 17:55:48 -08:00
Tim Abbott
12756b48a0 populate_db: Fix help text for --test-suite. 2019-02-20 17:42:30 -08:00
Tim Abbott
7910b9e739 docs: Recommend yarn install over yarn upgrade.
For most updates to our dependencies, we want the more conservative
yarn install.
2019-02-20 16:37:11 -08:00
Eeshan Garg
cfe0f6b56d webhooks/clubhouse: Account for bug in GitHub branch payloads.
This change was prompted by a possible bug on Clubhouse's end. In
general, if a branch is added, it also prompts a workflow state
transition in its primary story.

However, our webhook error logs show an erroneous payload where
the same branch is added to another story, but there is no
workflow state transition. Also, both the stories are grouped in
the same payload, which confused/broke our code. Ideally, this
shouldn't happen and is most likely a bug on Clubhouse's end.
In most cases, changes included in Clubhouse payloads never
pertain to more than one parent entity (stories) simultaneously,
and we usually operate under the assumption that the changes
included therein are related to each other in terms of their
parent object (story or epic) and not a child object (the GitHub
branch).
2019-02-20 16:32:42 -08:00
Eeshan Garg
76b1a8379b webhooks/clubhouse: Support epic_archive events. 2019-02-20 16:32:42 -08:00
Eeshan Garg
51a1b76a1f webhooks/clubhouse: Ignore story comment updates.
Comment updates in general aren't very informative.
Plus, errors for this event type were cluttering up our
webhook logs.
2019-02-20 16:32:42 -08:00
Eeshan Garg
76e58d05cb webhooks/jira: Ignore a few noisy events.
UnexpectedWebhookEventType errors for these events were cluttering
up our webhook error logs.
2019-02-20 16:32:42 -08:00
Eeshan Garg
fa29006311 webhooks/github: Ignore check_suite events.
A check suite is a collection of check runs. We care a lot more
about the outcomes of check runs in this case because check_run
payloads are a lot more informative than check_suite payloads.

(And in any case, the check_suite events are primarily for notifying
tools like CI to run checks).
2019-02-20 16:32:42 -08:00
Eeshan Garg
a0717e4424 webhook/github: Support check_run events.
We only support notifications for events where a check run has
completed. Notifications for when a check run has been queued or
is in progress are not very informative and may be too noisy.
2019-02-20 16:32:39 -08:00
Tim Abbott
4da430e276 message_list: Fix buggy rerendering of dates with local echo.
The bug here was that when we rerendered messages following local echo
through the echo.process_from_server code path, the eventual call to
_rerender_header() made the implicit assumption that all messages in a
message group had the same date.  As a result, it created a totally
new/fake message group and called the rendering logic on that group
without calling the functions for setting up recipient row dates,
which would always result in no recipient bar date being added.  This
bug was latent/invisible before, because when introduced, the locally
echoed messages were always being added to a recipient group from
today, where the recipient bar's date area was by default empty anyway.

This latent bug was revealed when we modified the structure of the app
to do date dividers between individual messages within a message
group, rather than strictly between message groups.
2019-02-20 16:24:28 -08:00
Tim Abbott
f4aa71fc75 server_events: Fix unnecessary call to insert_new_messages.
When we're handling a single message that was locally echoed, there
will very likely be 0 messages not removed by
`echo.process_from_server`, and we can skip the unnecessary call to
`message_events.insert_new_messages`.  This is a small performance
optimization and logical simplification when sending messages.
2019-02-20 16:24:28 -08:00
Wyatt Hoodes
2580965284 test-backend: Rename '--process' option to '--parallel'.
This change is being made to simply match up our naming conventions
with django's test framework.
2019-02-20 13:25:49 -08:00
Tim Abbott
cbc62b8e07 streams: Prevent creation of multi-line stream descriptions.
We do not anticipate our UI for showing stream descriptions looking
reasonable for multi-line descriptions, so we should just ban creating
them.

Given the frontend changes, multi-line descriptions are only likely to
show up from importing content from other tools, in which case
replacing newlines with spaces is cleaner than the alternative.
2019-02-20 12:28:00 -08:00
Hemanth V. Alluri
3134453220 streams_edit: Prevent newline characters in the description.
This commit achieves two things:
  1. Changes the UI of the "Create stream" form to make the
     textarea previously used to get the stream description
     a simple input field of type text (to suggest a single
     line description).

  2. Adds an extra check on the frontend side to make sure that
     when users create a new stream via. the "Create stream"
     option in the settings panel, they can't enter any newline
     characters (i.e. we disallow the enter key from being
     registered when typing out the stream description).
     We must also make sure that they cannot copy-and-paste over
     descriptions containing newline characters.

  resolves #11617
2019-02-20 12:27:54 -08:00
Rohitt Vashishtha
95d04386e2 docs: Add docs for silent mentions syntax. 2019-02-20 10:41:42 -08:00
Rohitt Vashishtha
8119258c4d typeahead: Migrate from _@ to @_ for silent mentions.
We also clean up the code a little to make it easier to
read and combine the matching code for both mentions and
silent_mentions.
2019-02-20 10:41:42 -08:00
Rohitt Vashishtha
5c2e64d6a2 tests: Fix accidental uses of assert() -> assert.equal(). 2019-02-20 10:41:42 -08:00
Rohitt Vashishtha
92658d2ac9 markdown: Move code related to @mentions to markdown.js.
For consistency, we should keep all the code that works with
@mentions in markdown.js. In this case, message_list_view was
rewriting the contents of the mentions in cases where users'
names had been changed since we rendered their mention.
2019-02-20 10:41:42 -08:00
Rohitt Vashishtha
44ec83ef28 markdown: Render silent mentions as **name**.
This change should help people discover to distinguish
silent mentions in text as a part of Zulip syntax while
differentiating them from regular mentions.
2019-02-20 10:41:42 -08:00
Rohitt Vashishtha
57b9991396 markdown: Change syntax of silent mentions ( _@person -> @_person). 2019-02-20 10:41:42 -08:00
Steve Howell
cdce66813e drafts: Fix date-sensitive test.
To test formatting we want a hard coded date, so we
can verify the date arithmetic with stable dates.

To make the test less brittle, we disable the
feature to remove old drafts.

This was an emergency fix.  We should probably just
remove the last N drafts instead of having the 30-day
limit.  Or we should have a better way to stub the cutoff
date.
2019-02-20 06:49:19 -08:00
Rishi Gupta
fd77c78a97 integrations: Fix broken link to jira.png.
Fixes regression from 1595162.
2019-02-19 16:39:44 -08:00
Rishi Gupta
8cc387c67f integrations: Run svgo to optimize svg files.
Fixes broken build.
2019-02-19 16:10:17 -08:00
Rishi Gupta
e40731574a integrations: Fix missing logo for trello.
Fixes regression from 6f8481c.
2019-02-19 15:41:18 -08:00
synicalsyntax
f08e8c8ffc integrations: Update Freshdesk logo.
Eliminated legacy logo.
2019-02-19 15:08:45 -08:00
synicalsyntax
498cf1b905 integrations: Improve resolution of Greenhouse logo. 2019-02-19 15:07:25 -08:00
synicalsyntax
03d4f248fd integrations: Improve resolution of Gosquared logo. 2019-02-19 15:07:24 -08:00
synicalsyntax
bf4c7d409a integrations: Update Statuspage logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
ccd06100d5 integrations: Update Raygun logo.
Updates legacy logo and converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
f0f3f88dd3 integrations: Update Flock logo.
Updates legacy logo and converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
6e18040da0 integrations: Update Dialogflow logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
2a5fe09d16 integrations: Update Opsgenie logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
6ddb03fad9 integrations: Update GoCD logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
756e95867c integrations: Update Discourse logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
1595162496 integrations: Update Jira logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
fc7cf5462f integrations: Update Instagram logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
b65d9e9e10 integrations: Update Clubhouse logo.
Updates legacy logo and converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
5bf89b946d integrations: Update Bitbucket logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
6f8481cd33 integrations: Update Trello logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
f1a2fe74a6 integrations: Update Beeminder logo.
Converts logo from PNG to SVG format.
2019-02-19 15:07:24 -08:00
synicalsyntax
2b78b643d8 integrations: Update Groove logo.
Eliminated legacy logo and changes logo to SVG format.
2019-02-19 14:56:55 -08:00
synicalsyntax
43cf75c075 integrations: Improve resolution of Zendesk logo. 2019-02-19 14:56:55 -08:00
Raymond Akornor
4dc7f5354d tests: Optimize test-backend performance.
This optimizes test-backend by skipping webhook
tests when run in default mode.

Tweaked by tabbott to extend the documentation and update the CI
commands.
2019-02-19 14:50:41 -08:00
Eeshan Garg
c78c3f423c webhooks/github: Ignore project_card events.
The payloads for this event are missing some important details
about the Project's changes, such as the name of the project,
the card's column name, etc. Without such details, the resultant
notifications would not be useful at all!
2019-02-19 14:25:38 -08:00
Eeshan Garg
ec81410b03 webhooks/github: Ignore repository_vulnerability_alert event.
This event isn't incredibly common/useful and errors for this
event were cluttering up our webhook logs.
2019-02-19 18:01:05 -03:30
alex
254da4ad81 send_button: Remove unnecessary self-cancelling margin. 2019-02-19 12:14:17 -08:00
synicalsyntax
4cc49a693b night mode: Improve coloring of emoji picker. 2019-02-18 19:49:24 -08:00
synicalsyntax
c808dcea18 subs: Reorder stream row selectors for SASS nested selector feature. 2019-02-18 16:08:09 -08:00
synicalsyntax
0d32225bdd night mode: Improve coloring of message reactions. 2019-02-18 15:57:51 -08:00
Tim Abbott
fe4a0d0fcd capitalization: Fix night logo lint errors. 2019-02-18 15:53:55 -08:00
synicalsyntax
0581fd3d51 integrations: Increase min-height of page content.
This allows the footer to not fall under the gradient area.

Fixes #11591.
2019-02-18 15:41:41 -08:00
synicalsyntax
e22c637adf landing page: Adjust white fade gradient color.
The background color of the portico pages aren't true white,
so this commit adjusts it to match the actual portico page
background color to eliminate differences.
2019-02-18 15:41:41 -08:00
sahil839
7157edf4af settings: Add support for uploading logo for night mode.
This adds a new field named realm_night_logo which is used for
displaying the organization logo when the user is in night mode.

Fixes #11176.
2019-02-18 15:15:57 -08:00
Steve Howell
e67cf30dfd private messages: Add user circles to top left.
This is mostly adding markup, calling some convenient
functions in buddy_data.js, and adjusting CSS.

To make the circles update dynamically, I mostly
orchestrate this though activity.js for now.  It's
possible we'll want to adjust that eventually to
happen through something like a `presence_events`
dispatcher, but that's essentially what
a good part of `activity.js` does now.
2019-02-18 14:22:37 -08:00
Steve Howell
a6fdac128f refactor: Move huddle_fraction_present() to buddy_data.
This is a pure data function, so there's no sense having
future callers go through activity.js.
2019-02-18 14:22:37 -08:00
Steve Howell
4c27353154 css: Position/size popover user circles in correct file.
We're soon gonna have user circles in four different places,
and the fourth place, Private Messages, will have different
size/position CSS.

Now each component does positioning and sizing in its
main CSS file:

    user info, group info -- popovers.scss
    buddy list, group PMs -- right-sidebar.scss

(We also use the more explicit syntax for padding each
side.)
2019-02-18 14:22:37 -08:00
Steve Howell
1adcaad04a refactor: Simplify logic for circles.
We now have a function get_user_circle_class
that returns one of these values:

    "user_circle_green"
    "user_circle_orange"
    "user_circle_empty"

And we put that in the templates.

And then CSS renders the circle of the appropriate
color.

The unit tests now explicitly capture whether
we are rendering the correct kind of circle.
2019-02-18 14:22:37 -08:00
Steve Howell
ba91f628c7 css: Use user_circle_fraction for group PM circles.
We rename this CSS class to something super concrete,
since all the associated CSS is very specifically
about drawing circles.
2019-02-18 14:22:37 -08:00
Steve Howell
ea05afdf04 css: Avoid unused background for group PMs.
The background color for group PMs is driven
by specific styles in the HTML, so the CSS
definition here was inaccurate.
2019-02-18 14:22:37 -08:00
Steve Howell
3c8c2abd99 css: Split out user_circles.scss.
This is a pure code move.

We want to use user circles in the left sidebar,
so this code will no longer belong in
right-sidebar.scss.

This code is just related to drawing the circles.
We can still position in size in other CSS files
(with more context-specific selectors).
2019-02-18 14:22:37 -08:00
Challa Venkata Raghava Reddy
815d009006 left_sidebar: Add scrollbar for private messages region.
This fixes a longstanding UI issue when you have way too many recent
private message conversations, as you can now scroll down the list to
find what you're looking for.

Fixes #5384.
2019-02-18 14:20:55 -08:00
Vaibhav
af3b18d1f5 messagebox: Remove on-message-row-hover controls visible rules.
Date separator exists inside the message_row, which causes the
message controls to be visible even when hovering on date
separator. These two rules are redundant and cause this buggy
action. Other rules handle the behaviour of message controls
being visible on message box hover. Hence these can be removed.
2019-02-18 14:15:16 -08:00
Tim Abbott
327e31ae03 docs: Document push-to-pull-request tooling. 2019-02-18 10:40:16 -08:00
Eeshan Garg
0500639d01 api_tests: Test zulip.Client.add_reaction. 2019-02-18 10:24:13 -08:00
Steve Howell
57aabc2a24 away: Use correct user circle in user group popup.
When you click on a user group mention, you see
the list of people with green/orange/empty circles
next to them.  We now correctly reflect away status.
2019-02-17 06:43:36 -08:00
Eeshan Garg
8de84eea4c pypi_packages: Upgrade to release 0.5.9. 2019-02-17 02:57:03 -03:30
Rishi Gupta
2df08618e9 help: Ensure bottom link in sidebar is above browser URL preview.
Previously, if you scrolled down all the way in the left sidebar, and kept
your mouse hovered over a link, you had a feeling that there was still "more
stuff", since you could see the top of "Back to Zulip" peeking out over the
top of the URL Chrome (and maybe some other browsers) add in the bottom left
corner.

This just adds a bit of margin so that "Back to Zulip" is above that when
scrolled all the way down.
2019-02-16 18:19:13 -08:00
Steve Howell
03484e274a refactor: Remove dead code in PM list.
The function that was called here has no side
effects.  If you don't use its value, it's just
wasted computation.  The real action happens
in the subsequent calls to `rebuild_recent`.
2019-02-16 12:03:03 -08:00
Rishi Gupta
ea8a087fd7 user popover: Rename user profile to full profile. 2019-02-16 11:39:10 -08:00
Tim Abbott
57e1307a3a provision: Fix virtualenv-clone handling of success-stamp.
Apparently, virtualenv-clone ends up copying the success-stamp file
that we use to track whether a virtualenv was successfully
provisioned, which results in problems if we get a network error in
the pip install stage afterwards.

The comment explains our fix, but basically we just delete
success-stamp after the clone.

Fixes #11301.
2019-02-16 11:24:10 -08:00
Steve Howell
4de04c460a css: Reduce scope of topic-name selector. 2019-02-16 10:07:46 -08:00
rht
888c84c283 IRC integration: Update documentation to recommend the direct bridge.
Edited by Rishi to remove the Matrix section.
2019-02-16 09:36:36 -08:00
Rishi Gupta
b856d9c0f9 user status: Change away to unavailable. 2019-02-16 09:28:58 -08:00
Rishi Gupta
86378bd0d8 user status: Remove bolding on button click. 2019-02-16 09:28:58 -08:00
Rishi Gupta
aa8ce36b94 user status: Change text of modal button to Save.
Having it say "Clear" when you delete an existing status was a nice touch,
but it's confusing when you first open the modal and the text of the button
says "Clear".

I think the right medium-term solution here is for this modal to have "Save"
and "Cancel" buttons, and for there to be a small UI element in the user
popover itself that allows you to clear your current status.
2019-02-16 09:28:58 -08:00
Tim Abbott
4e53110350 message_list: Fix handling of deleted user groups.
You can now render message lists containing them and click on them
without throwing an exception.
2019-02-15 14:54:25 -08:00
Tim Abbott
7a49611a94 settings_invites: Display links for multi-use invitations.
This makes it possible to figure out which is which if you have
several active at the same time.
2019-02-15 14:28:07 -08:00
Vishnu Ks
763eca6ca9 invites: Add UI for revoking multiuse invites. 2019-02-15 14:13:31 -08:00
Tim Abbott
03dcace09d invite: Extract do_revoke_invite click handler as a function. 2019-02-15 14:13:02 -08:00
Vishnu Ks
ef52f541fe invites: Fix the invalid invite time bug during filtering. 2019-02-15 13:58:30 -08:00
Vishnu Ks
410e2574d1 settings: Remove unused setting ACCOUNT_ACTIVATION_DAYS.
ACCOUNT_ACTIVATION_DAYS doesn't seems to be used anywhere.
INVITATION_LINK_VALIDITY_DAYS seems to do it's job currently.

(It was only ever used in very early Zulip commits).
2019-02-15 13:56:10 -08:00
Tim Abbott
0c0aec3cc9 export: Fix finding manage.py to export usermessages.
We were using a hardcoded relative path, which doesn't work if you're
not running this from the root of the Zulip checkout.

As part of fixing this, we need to make `LOCAL_UPLOADS_DIR` an
absolute path.

Fixes #11581.
2019-02-15 11:32:36 -08:00
Steve Howell
febad410f5 fix: Use padding, not margin, for the date separator.
My very recent margin fix was tested on a slightly
stale version of master.

    see c7e03f9a71
2019-02-15 11:30:36 -08:00
Steve Howell
b1f58fb1ff emoji picker: Prevent cropping.
We now use `fix_positions` to avoid cropping the emoji
picker.  You can see cropping pretty easily on a short
screen if you click the smiley icon for reactions on a
message.  It's a bit tricky to repro, since some
of the current top/bottom placements are correct, but
it's definitely reproducible.

I think there are opportunities to both simplify
and optimize `popovers.compute_placement`, so that it
plays nicer with `fix_positions`.  For example, I would
bias it even more strongly toward favoring right/left
placement.  But there are complicating factors--it is
also used by the hotspot code.

And I wanted to especially preserve the current
behavior when you launch the picker from the compose
box.  That's one place where it looks pretty bad if
you select "right" instead of "bottom".
2019-02-15 10:40:53 -08:00
Steve Howell
a537f4a075 refactor: Clean up viewport_center hack. 2019-02-15 10:40:53 -08:00
Steve Howell
c7e03f9a71 message view: Fix margin for date separator.
Without this tweak the date separator overlaps
the left borner.
2019-02-15 09:55:15 -08:00
Tim Abbott
8779e550a4 popovers: Use fix_positions option for streams popover.
The fix_positions argument here fixes the horizontal
position of the stream popover.

It also fixes the vertical position, both in the default case, and
also doing an appropriate adjustment for the case that the color
picker is open.

This contains a few changes by tabbott to, rather than hiding the
arrow unconditionally, only do so when it would no longer point at the
right part of the screen.

Fixes #2374.
Fixes #6059.
Fixes #7290.
2019-02-14 16:58:00 -08:00
Steve Howell
19a434a289 user popover: Fix cropping/positioning.
We use the `fix_positions` options every time
we launch a user popover, whether it is from
the message pane avatar or the buddy list
chevron.

For the message pane case, we can eliminate
some complexity related to trying to put
the menu above or below the avatar.  We now
always suggest "right", and if there are
constraints due to being close to the edge
of the screen, the fix_positions code
will take care of it.
2019-02-14 16:34:29 -08:00
Steve Howell
66c6423001 popovers: Restructure hardcoded "top" for user popover.
The patch to bootstrap will make the position smarter, but we still
want to preserve the 100px default vertical offset we chose for visual
reasons.

Tweaked by tabbott to preserve the visual design.
2019-02-14 16:34:15 -08:00
Steve Howell
21ccf45db9 bootstrap: Patch popover position calculations.
For large popovers (and tooltips) we want to avoid
having the popovers go offscreen.

Fixes #11469.
2019-02-14 16:32:57 -08:00
Steve Howell
5442b38a20 popovers: Rename template to no_arrow_popover.
The `user_info_popover` template is a generic
way to make a popover without the arrow effect,
and we'll want to reuse it for other popovers.
2019-02-14 16:16:04 -08:00
Anders Kaseorg
ce01a4c5a3 backup: Add Zulip, OS, and PostgreSQL version to the tarball.
==> zulip-backup/os-version <==
    Ubuntu trusty

    ==> zulip-backup/postgres-version <==
    90324

    ==> zulip-backup/zulip-version <==
    2.0.0-rc1+git
    2.0.0-rc1-50-gbf169b8-dirty

Documentation added by tabbott.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-14 15:11:57 -08:00
Rishi Gupta
801d14280d search: Update styling and text for no search results.
Changed <h5> to <p>, and removed the special formatting of
.empty_search_text to make this more in line with the formatting we
generally use with empty narrows.
2019-02-14 15:03:14 -08:00
Greg Price
0213aa0b16 push notif: Don't forget to clear "active" flag on sending to bouncer.
Since da8f4bc0e back in August, this control flow has caused
`flags.active_mobile_push_notification` to be cleared if we don't send
these `remove` messages at all, and if we send them directly to GCM...
but not if we send them via the Zulip notification bouncer.

As a result, on a server configured to send `remove` notification-messages
via the bouncer, we accumulate "active" messages and never clear them.

If the user then does `mark_all_as_read`, we end up sending a `remove`
for each of those messages again, and all in one giant burst.  We've
seen puzzling bursts of hundreds of removals pass through the bouncer
since turning on removals on chat.zulip.org; it's likely many of them
are caused by this bug.

This issue was made more acute with f4478aad5, which unconditionally
enabled removals.

Test added by tabbott.
2019-02-14 14:52:53 -08:00
Vishnu Ks
949d098e99 management: Add tooling for transfering local uploads to s3.
This solves a common migration problem for folks who cut corners when
first setting up Zulip.

Fixes #11294.
2019-02-14 14:31:46 -08:00
Vishnu Ks
6d138bd3e5 tests: Fix broken avatar_disk_path for original size input.
string.replace returns the new string and does
not change the original string.
2019-02-14 14:18:03 -08:00
Vaibhav
fb111d017f drafts: Remove left border from draft-box.
This removes the left border extending the stream label from the
recipient bar in from the drafts in drafts modal.  Those borders are
important in the message feed for containing several messages, but
here we're only ever going to show individual drafts, and this change
avoids potential color clashes with the blue box surrounding the
recipient blocks.
2019-02-14 11:33:08 -08:00
Vaibhav
2ca8ec371e drafts: Change foreground for dark background streams in drafts modal.
In drafts modal, dark background streams still had black foreground;
This changes the foreground to white for the same.
2019-02-14 11:32:11 -08:00
Vaibhav
162f06bbbb drafts: Add blue border around the active draft.
This removes the change in background to a darker one for active draft,
also removes the change in recipient_row_date color to blue; adds a blue
border around the draft box.
2019-02-14 11:32:11 -08:00
Harshit Bansal
d386706382 emoji: Fix traceback on opening emoji popover in quick succession.
Since the bootstrap popovers are destroyed asynchronously so opening a
emoji popover in quick succession like by clicking the reaction button
on another message was causing a race condition which was causing some
operations to be applied on a destroyed emoji popover.  This commit
fixes it by making sure to apply any operations only to the currently
active popover.

Fixes: #9851.
2019-02-14 11:29:25 -08:00
Rishi Gupta
403ae625cd help: Make minor edits and style updates to the Sending Messages section. 2019-02-13 18:03:22 -08:00
Rishi Gupta
559071877e help: Update edit-or-delete-a-message. 2019-02-13 18:03:22 -08:00
Rishi Gupta
20d692bbd6 help: Remove compose-and-reply.
This page was too messy and hard to parse. Parent commits already copied
most of the content out into other articles.
2019-02-13 18:03:22 -08:00
Rishi Gupta
a2130ca106 help: Separate quote-and-reply into its own article. 2019-02-13 18:03:22 -08:00
Rishi Gupta
2454eff51d help: Rename and update at-mention-a-team-member. 2019-02-13 18:03:22 -08:00
Rishi Gupta
4e33c3a970 help: Make open-the-compose-box a separate article. 2019-02-13 18:03:22 -08:00
Rishi Gupta
64cdac9294 help: Remove zulip-glossary.
I'm torn about this, since there is good content here. But ultimately I think
* This page is a lot of work to write and maintain.
* In most cases, the right thing is for people to find the page that
  explains the full feature. E.g. if you don't know what an "administrator"
  is, the page I hope you find is "Roles and Permissions". For bots, it's
  "Bots and Integrations". Writing a punchy short summary for a glossary
  that does better than that is possible, but not fast.
* People find things via search, e.g. by Googling "What is X in Zulip",
  rather than looking for a glossary.
* This page was written more than 3 years ago, before we had 100+ help
  articles. So it may have served a purpose in the past that no longer
  exists.
2019-02-13 18:03:22 -08:00
Rishi Gupta
e40af1ca7f help: Update title of change-your-language. 2019-02-13 17:50:39 -08:00
Rishi Gupta
e183c316dd help: Rename help/change-your-avatar to help/set-your-avatar. 2019-02-13 17:50:39 -08:00
Rishi Gupta
f25cc5a580 help: Update starred messages to include starred messages counts.
This is not yet live in production, but clearing out the TODO list while I'm
looking at these docs.
2019-02-13 17:50:39 -08:00
Tim Abbott
d44b8981e2 docs: Update changelog with most changes for 2.0 release. 2019-02-13 16:54:57 -08:00
Vaibhav
5796d9d623 drafts: Change width of the drafts modal to 58%. 2019-02-13 16:16:34 -08:00
Vaibhav
d710be866f drafts: Change spacing of drafts in modal.
Increase spacing (horizontal padding) of drafts.
Also add spacing between pro-tip and hr.
2019-02-13 16:16:34 -08:00
Vaibhav
72bd3d22e8 drafts: Add helper functions to get focused draft rows.
Adds three helper functions - `row_with_focus`, `row_before_focus` and
`row_after_focus` to get the focused, previous and next to focused
draft rows respectively.
2019-02-13 16:16:34 -08:00
Vaibhav
e0134111d5 drafts: Rename delete_id to draft_to_be_focused_id.
`delete_id` in `drafts.js` referred to the next draft row which was
to be focused when deleting using hot keys. The var name was absurd
and is hence renamed.
2019-02-13 16:16:34 -08:00
Vaibhav
69424e4f2f drafts: Refactor code used to remove drafts.
Adds a `remove_draft` function which deletes the draft and updates the ui
by removing it from the list of drafts.
Also adds comments to increase readability.
2019-02-13 16:16:34 -08:00
Steve Howell
8a4aa0e49a drafts: Add reminder of hotkey. 2019-02-13 16:16:34 -08:00
Steve Howell
0f21020783 drafts: Put 30-day notice in header (to prevent scroll). 2019-02-13 16:16:34 -08:00
Steve Howell
c4cd0fe0c1 drafts: Use a reverse-cron sort.
I think it's natural for your eyes get drawn to
the top of the modal, so that's where we should
put the most recent draft.
2019-02-13 16:16:34 -08:00
Abdelhadi Dyouri
4ac2db56f8 export: Correctly treat emoji author field as optional.
While we likely will eventually want to make every custom emoji have
an author, that's not the data model today.

Fixes #11518.
2019-02-13 16:12:06 -08:00
Tim Abbott
4d1fb5270d message view: Fix asymmetric padding on date separators. 2019-02-13 16:03:33 -08:00
Anders Kaseorg
89897bcf70 css: Move inline date separators from messagebox to message_row.
Fixes border-related glitches introduced by commit
51c6c82003 (#10820).  Alternative
to #11534.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-13 16:03:21 -08:00
Anders Kaseorg
dae6aa21d8 css: Remove dead CSS classes message_data, prev_is_same_sender.
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-02-13 16:03:16 -08:00
Mohit Gupta
bf14f4cd7b notification: Show wrong narrow notification for non locally echoed message.
Show "sent to different narrow" notification and other such notification by
notifications.notify_local_mixes for non locally echoed message sent by
current client.

With significant new comments added by tabbott.

Fixes: #11488.
2019-02-13 15:51:41 -08:00
Mohit Gupta
e5f28ca78e refactor: Rename locally_echoed to sent_by_this_client.
This is a bit clearer, since we will soon want to pass this option for
messages that could not be locally echoed due to markdown rendering.
2019-02-13 15:30:57 -08:00
Tim Abbott
944d590298 settings: Offer starred messages count setting publicly.
Previously, this was only available in the Zulip development
environment.

Further work is needed on documenting this and how to use it for
managing work to follow up on.
2019-02-13 15:11:17 -08:00
Pragati Agrawal
48175ce1f7 subs: Update Default streams data while renaming streams.
If a stream is a default stream, this updates its name at `Default Streams`
section of `Organization settings` page.

Fixes: #11466
2019-02-13 15:05:25 -08:00
Tim Abbott
a0add8f651 puppet: Add IPv6 support to standard nginx listen directives.
This should save some setup work for anyone wanting to setup nginx on
their Zulip server.
2019-02-13 15:00:21 -08:00
Tim Abbott
c41bfcb9e0 Revert "activity: Change definition of active site."
This reverts commit 9f9b7cb991.

This commit made the page not perform well enough to load.
2019-02-13 14:52:13 -08:00
Greg Price
630481cb7a push notif: Switch from GCM to FCM endpoint.
This is the only server-side change required for the FCM migration!

Optionally, at some point in the future we might choose to migrate
to the new ("v1") API which FCM also offers.  Nothing revolutionary
but there are some nice things about it:
  https://firebase.google.com/docs/cloud-messaging/migrate-v1
2019-02-13 13:57:57 -08:00
Greg Price
84e0b68b16 push notif: Rename gcm to less confusing gcm_client.
This opens up space in the namespace for, say, the library
module itself.
2019-02-13 13:57:57 -08:00
YashRE42
93b6fa6036 search: Display stop words from query when no results.
This displays to the user clearly which words we ignored in their
search query due to being stop words.

Fixes #10592.
2019-02-13 13:23:48 -08:00
Tim Abbott
7099d01641 email mirror: Fix missing variable for logging. 2019-02-13 13:16:55 -08:00
Greg Price
f4478aad54 push notif: Unconditionally remove notifications on message read.
The client-side fix to make these not a problem was in release
16.2.96, of 2018-08-22.  We've been sending them from the
development community server chat.zulip.org since 2018-11-29.
We started forcing clients to upgrade with commit fb7bfbe9a,
deployed 2018-12-05 to zulipchat.com.

(The mobile app unconditionally makes a request to a route on
zulipchat.com to check for this kind of forced upgrade, so that
applies to mobile users of any Zulip server.)

So at this point it's long past safe for us to unconditionally
send these.  Hardwire the old `SEND_REMOVE_PUSH_NOTIFICATIONS`
setting to True, and simplify it out.
2019-02-13 13:13:45 -08:00
ss62171
a12c2921d7 email-log: Handle checkbox saying "Show text only version".
After clicking on checkbox saying "Show text only version" UI was rendered
correctly but after refreshing page keeping checkbox checked, emails were
shown without "text only version" but checkbox value remained checked.

Now after refreshing page checkbox value changes to its default value.
2019-02-13 11:44:09 -08:00
Tim Abbott
ab18dbfde5 uwsgi: Increase buffer-size to 8192.
For users putting Zulip behind certain proxies (and potentially some
third-party API clients), buffer sizes can exceed the uwsgi default of
4096.  Since we aren't doing such high-throughput APIs that a small
buffer size is valuable, we should just raise this for everyone.
2019-02-13 11:17:55 -08:00
savish
1b334b906a tests: Use subTest in test_admin_user_can_change_profile_data.
Fixes #11070.
2019-02-13 10:50:39 -08:00
savish
aa605468b6 tests: Use subTest in test_update_realm_properties. 2019-02-13 10:49:13 -08:00
savish
9c292fbeab tests: Use subTest in test_bugdown_fixtures. 2019-02-13 10:49:13 -08:00
Puneeth Chaganti
43caf28e36 digest: Use the same font for the salutation as other paragraphs.
The fact that these were different was just a subtle visual bug.
2019-02-13 10:43:26 -08:00
Puneeth Chaganti
29925fd303 digest: Fix width of digest-email-container.
The width of the messages div is set to 600px, while the
digest-email-container can be 500px at the most. Increasing the width
of the digest-email-container makes the /digest slightly more
readable.
2019-02-13 10:43:21 -08:00
Rishi Gupta
0dfb18fb3b help: Document wide organization logo. 2019-02-13 10:41:29 -08:00
Rishi Gupta
750fff16ef help: Remove TODOs from sidebar_index.md. 2019-02-13 10:41:29 -08:00
Rishi Gupta
e3496830f1 help: Add hide-message-content-in-emails. 2019-02-13 10:41:29 -08:00
Rishi Gupta
7e0e380b5a help: Add change-notification-sound. 2019-02-13 10:41:29 -08:00
Rishi Gupta
458f988262 help: Add configure-missed-message-emails. 2019-02-13 10:41:29 -08:00
Rishi Gupta
d20be1dd66 help: Add disable-new-login-emails. 2019-02-13 10:41:29 -08:00
Rishi Gupta
db3690bffe help: Update emoji-and-emoticons to document changing emoji set. 2019-02-13 10:41:29 -08:00
Rishi Gupta
3b9cb9c68c help: Add change-your-timezone. 2019-02-13 10:41:29 -08:00
Rishi Gupta
378d14af7e import: Fix tests related to plan_type.
Broken in 4d08461.
2019-02-12 18:11:31 -08:00
Tim Abbott
12d5e870c5 tests: Fix import test failure.
Broken in 4d08461ab1.
2019-02-12 17:46:55 -08:00
bartek
9f9b7cb991 activity: Change definition of active site.
Signed-off-by: bartek <bartek.jachowicz@gmail.com>

Edits by Rishi Gupta <rishig@zulipchat.com>

Fixes: #10432
2019-02-12 16:36:44 -08:00
Rishi Gupta
68d73f2e12 left sidebar: Remove border from starred messages count.
The padding changes move the number a bit to the right and down, towards
where the bottom right corner of an unread count box would have been. This
makes the number look better aligned with the unread count boxes above it.
2019-02-12 16:05:35 -08:00
Tim Abbott
4d08461ab1 import: Set plan_type to SELF_HOSTED on import.
We've for a while had logic to set plan_type to LIMITED when importing
into Zulip Cloud; we need corresponding logic to set it to SELF_HOSTED
when importing into a self-hosted server.

Fixes #11541.
2019-02-12 16:01:02 -08:00
Thomas Ip
60c9f22129 typescript: Update TS related dependencies. 2019-02-12 15:59:51 -08:00
Rohitt Vashishtha
15e29e209c markdown: Handle SyntaxError in python_to_js_filter.
We swallow the error if our python_to_js_filter code is
unable to parse some python regex properly. This ensures
that the web app stays responsive.

We would fail to show an accurate local echo for these
regexes, however, the backend would act as the final
authority for handling the realm pattern conversion.
2019-02-12 15:58:09 -08:00
Natsu Kagami
d936fcab3b markdown: Handle multiple python regex capture groups properly.
Since on replacing the first 'P<>' group, we remove this text from
the string, we have to make the RegExp start looking from index 0
again to properly convert later 'P<>' groups to JS regex syntax.
2019-02-12 15:54:28 -08:00
Vishnu Ks
868a763cec auth2: Don't use session for passing multiuse invite key.
For Google auth, the multiuse invite key should be stored in the
csrf_state sent to google along with other values like is_signup,
mobile_flow_otp.

For social auth, the multiuse invite key should be passed as params to
the social-auth backend. The passing of the key is handled by
social_auth pipeline and made available to us when the auth is
completed.
2019-02-12 15:51:11 -08:00
Eeshan Garg
179b747769 streams: Refactor multi-option helpers into separate functions.
For internal stream messages, most of the time, we have access to
a Stream object. For the few corner cases where we don't, it is a
much cleaner approach to have a separate function that accepts a
stream name than having one multi-option helper that accepts both
names and objects.
2019-02-12 11:10:26 -08:00
Steve Howell
c7a9faa803 right sidebar: Move invite link below Group PMs.
It looked kinda terrible in between the two
user lists.

There is some discussion here (I have to break the
link into two lines to make gitlint happy):

https://chat.zulip.org/#narrow/stream/
    101-design/topic/user.20sidebar.20in.20left/near/697682
2019-02-12 10:36:45 -08:00
Abhigyan Khaund
1ef34ccb98 docs: Typo fix in changelog for 2.0.0-rc1. 2019-02-12 10:29:13 -08:00
Steve Howell
96cbea3c11 bug fix: Move stream search out of scroll container.
We want the search widget, when visible, to be
outside the scroll container for the stream list.

One obvious use case is if you start scrolling, and
then realize it might be less effort to search.

Also, for user search, it already worked this way.

We have to add a couple resizing hooks here, but
it's not necessary to change the actual resize
calculation, since we move the section inside
of #streams_header, which is already accounted
for.

The only markup change here is to add
a `stream_search_section` class.  I don't
know why we use `notdisplayed` here instead of
jQuery, or what `input-append` is for, but I
considered them outside the scope of this change.

We can also remove some crufty CSS that was
compensating for it being inside the container.
2019-02-12 10:26:13 -08:00
Steve Howell
6fc45fd941 left sidebar: Disable "gray-out" feature for new users.
If a user has 30 subscribed streams or less, don't gray
them out if they haven't had recent activity.
2019-02-12 17:43:48 +00:00
Eeshan Garg
1d718adce4 zerver/views: Rename integrations.py to documentation.py.
The name "integrations" is misleading because we now also use
this module for our REST API docs.
2019-02-11 21:25:14 -08:00
Eeshan Garg
b0c761dfb1 zapier_app: Include bot details in response to auth requests.
The bot's details (such as ID and name) are used to format a
connection label in Zapier's UI. This allows users to distinguish
between different Zapier-to-Zulip connections set up with different
bots.
2019-02-11 21:24:52 -08:00
Tim Abbott
d6140b684f notifications: Don't send error emails on bouncer 500s.
Since the individual server administrator can't do anything about
these, this should not trigger an email notification.
2019-02-11 21:19:28 -08:00
Tim Abbott
23f950c60c version: Bump ZULIP_VERSION after 2.0.0-rc1 release. 2019-02-11 20:25:00 -08:00
403 changed files with 12400 additions and 11503 deletions

View File

@@ -121,6 +121,7 @@
"reactions": false,
"realm_icon": false,
"realm_logo": false,
"realm_night_logo": false,
"recent_senders": false,
"reload": false,
"reload_state": false,

View File

@@ -11,6 +11,7 @@ from django.utils.timezone import utc as timezone_utc
from analytics.lib.counts import COUNT_STATS, logger, process_count_stat
from scripts.lib.zulip_tools import ENDC, WARNING
from zerver.lib.remote_server import send_analytics_to_remote_server
from zerver.lib.timestamp import floor_to_hour
from zerver.models import Realm
@@ -84,3 +85,6 @@ class Command(BaseCommand):
print("Finished updating analytics counts through %s in %.3fs" %
(fill_to_time, time.time() - start))
logger.info("Finished updating analytics counts through %s" % (fill_to_time,))
if settings.PUSH_NOTIFICATION_BOUNCER_URL and settings.SUBMIT_USAGE_STATISTICS:
send_analytics_to_remote_server()

View File

@@ -1024,7 +1024,7 @@ class TestActiveUsersAudit(AnalyticsTestCase):
self.assertTrue(UserCount.objects.filter(
user=user, property=self.current_property, subgroup='false',
end_time=end_time, value=1).exists())
self.assertFalse(UserCount.objects.filter(user=user2).exists())
self.assertFalse(UserCount.objects.filter(user=user2, end_time=end_time).exists())
class TestRealmActiveHumans(AnalyticsTestCase):
def setUp(self) -> None:

View File

@@ -52,7 +52,7 @@ author = 'The Zulip Team'
# The short X.Y version.
version = '2.0'
# The full version, including alpha/beta/rc tags.
release = '2.0.0-rc1'
release = '2.0.0'
# This allows us to insert a warning that appears only on an unreleased
# version, e.g. to say that something is likely to have changed.

View File

@@ -128,7 +128,7 @@ commit message.
performance.
- When you fix a GitHub issue, [mark that you've fixed the issue in
your commit
message](https://help.github.com/articles/closing-issues-via-commit-messages/)
message](https://help.github.com/en/articles/closing-issues-via-commit-messages)
so that the issue is automatically closed when your code is merged.
Zulip's preferred style for this is to have the final paragraph of
the commit message read e.g. "Fixes: \#123."

View File

@@ -43,7 +43,7 @@ followed by the desired labels enclosed within double quotes (`""`).
(`""`).
* **Find unclaimed issues** — Use the [GitHub search
feature](https://help.github.com/articles/using-search-to-filter-issues-and-pull-requests/)
feature](https://help.github.com/en/articles/using-search-to-filter-issues-and-pull-requests)
to find unclaimed issues by adding one of the following filters to your search:
* `-label: "in progress"` (excludes issues labeled with the **in progress** label)

View File

@@ -77,7 +77,7 @@ Next, read the following to learn more about developing for Zulip:
* [Testing](../testing/testing.html)
[github-join]: https://github.com/join
[github-help-add-ssh-key]: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/
[github-help-add-ssh-key]: https://help.github.com/en/articles/adding-a-new-ssh-key-to-your-github-account
[github-zulip-zulip]: https://github.com/zulip/zulip/
[github-help-fork]: https://help.github.com/articles/fork-a-repo/
[github-help-fork]: https://help.github.com/en/articles/fork-a-repo
[gitbook-rebase]: https://git-scm.com/book/en/v2/Git-Branching-Rebasing

View File

@@ -66,7 +66,7 @@ Follow our [Git Guide][set-up-git] in order to install Git, set up a
GitHub account, create an SSH key to access code on GitHub
efficiently, etc. Be sure to create an ssh key and add it to your
GitHub account using
[these instructions](https://help.github.com/articles/generating-an-ssh-key/).
[these instructions](https://help.github.com/en/articles/generating-an-ssh-key).
### Step 1: Install Prerequisites
@@ -278,11 +278,12 @@ Now you are ready for [Step 2: Get Zulip Code.](#step-2-get-zulip-code)
2. Open Terminal (macOS/Ubuntu) or Git BASH (Windows; must
**run as an Administrator**).
3. In Terminal/Git BASH,
[clone your fork of the Zulip repository](../git/cloning.html#step-1b-clone-to-your-machine)
and [connect the Zulip upstream repository](../git/cloning.html#step-1c-connect-your-fork-to-zulip-upstream):
[clone your fork of the Zulip repository](../git/cloning.html#step-1b-clone-to-your-machine) and
[connect the Zulip upstream repository](../git/cloning.html#step-1c-connect-your-fork-to-zulip-upstream):
```
git clone --config pull.rebase git@github.com:YOURUSERNAME/zulip.git
cd zulip
git remote add -f upstream https://github.com/zulip/zulip.git
```

View File

@@ -143,10 +143,10 @@ Zulip.
![Screencast of Travis CI setup](../_static/zulip-travisci.gif)
[gitbook-rebase]: https://git-scm.com/book/en/v2/Git-Branching-Rebasing
[github-help-add-ssh-key]: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/
[github-help-conf-remote]: https://help.github.com/articles/configuring-a-remote-for-a-fork/
[github-help-fork]: https://help.github.com/articles/fork-a-repo/
[github-help-sync-fork]: https://help.github.com/articles/syncing-a-fork/
[github-help-add-ssh-key]: https://help.github.com/en/articles/adding-a-new-ssh-key-to-your-github-account
[github-help-conf-remote]: https://help.github.com/en/articles/configuring-a-remote-for-a-fork
[github-help-fork]: https://help.github.com/en/articles/fork-a-repo
[github-help-sync-fork]: https://help.github.com/en/articles/syncing-a-fork
[github-zulip]: https://github.com/zulip/
[github-zulip-zulip]: https://github.com/zulip/zulip/
[travis-ci]: https://travis-ci.org/

View File

@@ -53,5 +53,5 @@ tools/fetch-rebase-pull-request <PR-number>
tools/fetch-pull-request <PR-number>
```
[github-help-co-pr-locally]: https://help.github.com/articles/checking-out-pull-requests-locally/
[github-help-co-pr-locally]: https://help.github.com/en/articles/checking-out-pull-requests-locally
[tools-PR]: ../git/zulip-tools.html#fetch-a-pull-request-and-rebase

View File

@@ -1,6 +1,6 @@
# Fixing Commits
This is mostly from
[here](https://help.github.com/articles/changing-a-commit-message/#rewriting-the-most-recent-commit-message).
[here](https://help.github.com/en/articles/changing-a-commit-message#rewriting-the-most-recent-commit-message).
## Fixing the last commit
### Changing the last commit message

View File

@@ -143,8 +143,8 @@ explain to the reviewer how you solved any problems they mentioned, and c) ask
for another review.
[edx-howto-rebase-pr]: https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request
[github-help-about-pr]: https://help.github.com/articles/about-pull-requests/
[github-help-create-pr-fork]: https://help.github.com/articles/creating-a-pull-request-from-a-fork/
[github-help-about-pr]: https://help.github.com/en/articles/about-pull-requests
[github-help-create-pr-fork]: https://help.github.com/en/articles/creating-a-pull-request-from-a-fork
[images-create-pr]: ../images/zulip-open-pr.png
[keep-up-to-date]: ../git/using.html#keep-your-fork-up-to-date
[push-commits]: ../git/using.html#push-your-commits-to-github

View File

@@ -63,5 +63,5 @@ And, if none of the above are to your liking, try [one of these][gitbook-guis].
[gitgui-gitk]: https://git-scm.com/docs/gitk
[gitgui-gitxdev]: https://rowanj.github.io/gitx/
[gitgui-sourcetree]: https://www.sourcetreeapp.com/
[github-help-add-ssh-key]: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/
[github-help-add-ssh-key]: https://help.github.com/en/articles/adding-a-new-ssh-key-to-your-github-account
[tig]: http://jonas.nitro.dk/tig/

View File

@@ -34,7 +34,7 @@ Here are the top things to know:
- **Git stores all data as objects, of which there are four types:** blob
(file), tree (directory), commit (revision), and tag. Each of these objects
is named by a unique hash, the SHA-1 has of its contents. Most of the time
is named by a unique hash, the SHA-1 hash of its contents. Most of the time
you'll refer to objects by their truncated hash or more human-readable
reference like `HEAD` (the current branch). Blobs and trees represent files
and directories. Tags are named references to other objects. A commit object

View File

@@ -277,4 +277,4 @@ whichever branch you need to update.
[gitbook-basic-merge-conflicts]: https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging#Basic-Merge-Conflicts
[gitbook-git-cherry-pick]: https://git-scm.com/docs/git-cherry-pick
[gitbook-reset]: https://git-scm.com/docs/git-reset
[github-help-resolve-merge-conflict]: https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/
[github-help-resolve-merge-conflict]: https://help.github.com/en/articles/resolving-a-merge-conflict-using-the-command-line

View File

@@ -442,10 +442,10 @@ complicated rebase.
[gitbook-other-envs-bash]: https://git-scm.com/book/en/v2/Git-in-Other-Environments-Git-in-Bash
[gitbook-other-envs-zsh]: https://git-scm.com/book/en/v2/Git-in-Other-Environments-Git-in-Zsh
[gitbook-rm]: https://git-scm.com/docs/git-rm
[github-help-closing-issues]: https://help.github.com/articles/closing-issues-via-commit-messages/
[github-help-push]: https://help.github.com/articles/pushing-to-a-remote/
[github-help-rebase]: https://help.github.com/articles/using-git-rebase/
[github-help-sync-fork]: https://help.github.com/articles/syncing-a-fork/
[github-help-closing-issues]: https://help.github.com/en/articles/closing-issues-via-commit-messages
[github-help-push]: https://help.github.com/en/articles/pushing-to-a-remote
[github-help-rebase]: https://help.github.com/en/articles/using-git-rebase
[github-help-sync-fork]: https://help.github.com/en/articles/syncing-a-fork
[how-git-is-different]: ./the-git-difference.html
[zulip-git-guide-up-to-date]: ../git/using.html#keep-your-fork-up-to-date
[zulip-rtd-commit-discipline]: ../contributing/version-control.html#commit-discipline

View File

@@ -115,6 +115,33 @@ Switched to a new branch 'review-original-5156'
HEAD is now at 5a1e982 tools: Update clean-branches to clean review branches.
```
## Push to a pull request
`tools/push-to-pull-request` is primarily useful for maintainers who
are merging other users' commits into a Zulip repository. After doing
`reset-to-pull-request` or `fetch-pull-request` and making some
changes, you can push a branch back to a pull request with e.g.
`tools/push-to-pull-rqeuest 1234`. This is useful for a few things:
* Getting CI to run and enabling you to use the GitHub "Merge" buttons
to merge a PR after you make some corrections to a PR, without
waiting for an extra round trip with the PR author.
* For commits that aren't ready to merge yet, communicating clearly
any changes you'd like to see happen that are easier for you to
explain by just editing the code than in words.
* Saving a contributor from needing to duplicate any rebase work that
you did as part of integrating parts of the PR.
You'll likely want to comment on the PR after doing so, to ensure that
the original contributor knows to pull your changes rather than
accidentally overwriting them with a force push when they make their
next batch of changes.
Note that in order to do this you need permission to do such a push,
which GitHub offers by default to users with write access to the
repository. For multiple developers collaborating on a PR, you can
achieve this by granting other users permission to write to your fork.
## Delete unimportant branches
`tools/clean-branches` is a shell script that removes branches that are either:

View File

@@ -7,7 +7,7 @@ All notable changes to the Zulip server are documented in this file.
This section lists notable unreleased changes; it is generally updated
in bursts.
### 2.0.0-rc1 -- 2019-02-11
### 2.0.0 -- 2019-03-01
**Highlights:**
- Added automation for synchronizing user avatars, custom profile
@@ -15,19 +15,33 @@ in bursts.
- Added support for explicitly setting oneself as "away" and "user
status" messages.
- Added a built-in /poll slash command for lightweight polls.
- Added support for using Zoom as the video chat provider. We now
support Jitsi, Google Hangouts, and Zoom.
- Added support for branding the top-right corner of the logged in app
- Added experimental support for using Zoom as the video chat
provider. We now support Jitsi, Google Hangouts, and Zoom.
- Added support for branding the top-left corner of the logged in app
with an organization's logo.
- Zulip's "Guest users" feature is no longer experimental.
- The HipChat/Stride data import tool is no longer experimental.
Our HipChat and Slack import tools are now well-tested with millions
of messages, 10,000s of users, and 100,000s of uploaded files.
- Added a built-in tool for backups and restoration.
- Deprecated support for Ubuntu Trusty. Zulip 2.0.x will continue to
support Ubuntu Trusty, but Zulip 2.1.0 will remove support for
installing on Trusty.
**Upgrade notes:**
- This release adds support for [submitting basic usage statistics] to
help the Zulip core team. This feature can be enabled only if a server
is using the [Mobile Push Notification Service][mpns-statistics-docs],
and is enabled by default in that case. To disable it, set
`SUBMIT_USAGE_STATISTICS = False` in `/etc/zulip/settings.py`.
[mpns-statistics-docs]: ../production/mobile-push-notifications.html#submitting-statistics
**Full feature changelog:**
- Added support for CentOS 7 in the development environment
provisioning process. This is an important step towards production
CentOS/RHEL 7 support.
- Added a new invitation workflow with reusable links.
- Added a new Azure Active Directory authentication integration.
New authentication backends supported by python-social-auth can now be
added with just a few dozen lines of code.
@@ -46,6 +60,7 @@ in bursts.
- Added Ctrl+. shortcut for narrowing to current compose recipient.
- Added icons to indicate which "organization settings" tabs are
available to regular users.
- Added a tool for migrating from S3 to the local file uploads backend.
- Added protocol for communicating version incompatibility to mobile apps.
- Added support for copying avatar and other profile data when
creating a second account on a Zulip server with a given email address.
@@ -55,10 +70,14 @@ in bursts.
- Added a ReviewBoard integration, and improved numerous existing integrations.
- Added support for multi-line messages for the /me feature.
- Added markdown rendering of text when displaying custom profile fields.
- Added "silent mentions" syntax (_@**Tim Abbott**), which show
visually, but don't trigger a notification for the target user.
- Added "silent mentions" syntax (`@_**Tim Abbott**`), which show
visually, but don't trigger a notification to the target user.
- Added support for using lightbox in compose preview.
- Changes in date no longer force a repeated recipient bar. This
fixes a common source of confusion for new users.
- Suppressed notifications when quoting a message mentioning yourself.
- Message editing now has the compose widgets for emoji, video calls, etc.
- Message editing now has a markdown preview feature just like compose.
- Message editing now uses same "enter-sends" behavior as compose.
- Organization administrators can now edit users' custom profile fields.
- Optimized performance of data import from Slack, HipChat, etc.
@@ -74,8 +93,9 @@ in bursts.
- Fixed missing API authentication headers for mobile file access.
- Fixed various select and copy-paste issues.
- Fixed various back button bugs in settings UI.
- Fixed various mobile web visual issues.
- Fixed unnecessary resizing of animated custom emoji.
- Fixed some performance issues for organizations with 1000s of streams.
- Fixed several performance issues for organizations with 1000s of streams.
- Fixed various error handling bugs sending push notifications.
- Fixed handling of diacritics in user-mention typeahead.
- Fixed several bugs with importing data into Zulip's S3 backend.

View File

@@ -265,6 +265,16 @@ installation. Then, run as root:
/home/zulip/deployments/current/scripts/setup/restore-backup /path/to/backup
```
If you're not sure what versions were in use when a given backup was
created, you can get that information via the files in the backup
tarball `postgres-version`, `os-version`, and `zulip-version`. The
following command may be useful for viewing these files without
extracting the entire archive.
```
tar -Oaxf /path/to/archive/zulip-backup-rest.tar.gz zulip-backup/zulip-version
```
[install-server]: ../production/install.html
### What is included

View File

@@ -130,6 +130,21 @@ and privacy in mind:
If you have any questions about the security model, contact
support@zulipchat.com.
## Submitting statistics
Systems using the Mobile Push Notifications Service will, by default,
submit basic usage statistics (e.g. Zulip version, number of users,
number of messages sent) to the service. These statistics help the
Zulip open source project understand how many people are using Zulip,
and help us allocate resources towards supporting self-hosted
installations.
Our use of these statistics is governed by the same ToS and
Privacy Policy that covers the Mobile Push Notifications Service
itself. If your organization does not want to submit these
statistics, you can disable this feature at any time by setting
`SUBMIT_USAGE_STATISTICS=False` in `/etc/zulip/settings.py`.
## Legacy signup
Here are legacy instructions for signing a server up for push

View File

@@ -8,7 +8,8 @@ The default is the `LOCAL_UPLOADS_DIR` backend, which just stores
files on disk in the specified directory on the Zulip server.
Obviously, this backend doesn't work with multiple Zulip servers and
doesn't scale, but it's great for getting a Zulip server up and
running quickly.
running quickly. You can later migrate the uploads to S3 by
[following the instructions here](#migrating-from-local-uploads-to-amazon-s3-backend).
We also support an `S3` backend, which uses the Python `boto` library
to upload files to Amazon S3 (and, with some work, it should be
@@ -139,3 +140,26 @@ need a block like this:
The file-uploads bucket should not be world-readable. See the
[documentation on the Zulip security model](security-model.html) for
details on the security model for uploaded files.
## Migrating from local uploads to Amazon S3 backend
As you scale your server, you might want to migrate the uploads from
your local backend to Amazon S3. Follow these instructions, step by
step, to do the migration.
1. First, [setup the S3 backend](#s3-backend-configuration) in the settings
(all the auth stuff), but leave `LOCAL_UPLOADS_DIR` set -- the
migration tool will need that value to know where to find your uploads.
2. Run `./manage.py transfer_uploads_to_s3`. This will upload all the
files from the local uploads directory to Amazon S3. By default,
this command runs on 6 parallel processes, since uploading is a
latency-sensitive operation. You can control this parameter using
the `--processes` option.
3. Once the transer script compltes, disable `LOCAL_UPLOADS_DIR`, and
restart your server (continuing the last few steps of the S3
backend setup instructions).
Congratulations! Your uploaded files are now migrated to S3.
**Caveat**: The current version of this tool does not migrate an
uploaded organization avatar or logo.

View File

@@ -233,7 +233,7 @@ from the SSH session.
[mypy-docs]: ../testing/mypy.html
[requirements-readme]: https://github.com/zulip/zulip/blob/master/requirements/README.md
[stack-overflow]: https://askubuntu.com/questions/8653/how-to-keep-processes-running-after-ending-ssh-session
[caching]: https://help.github.com/articles/caching-your-github-password-in-git/
[caching]: https://help.github.com/en/articles/caching-your-github-password-in-git
## JavaScript and other frontend packages
@@ -251,7 +251,7 @@ reasoning here.
repository. We use the standard `package.json` file to declare our
direct dependencies, with sections for development and
production. Yarn takes care of pinning the versions of indirect
dependencies in the `yarn.lock` file; `yarn upgrade` updates the
dependencies in the `yarn.lock` file; `yarn install` updates the
`yarn.lock` files.
* `tools/update-prod-static`. This process is discussed in detail in
the [static asset pipeline](../subsystems/front-end-build-process.html) article,

View File

@@ -213,21 +213,33 @@ request; the logic is in `zerver/views/events_register.py` and
change event, it finds the user data in the `realm_user` data
struture, and updates it to have the new name.
This achieves everything we desire, at the cost that we need to write
the `apply_events` function. This is a difficult function to
implement correctly, because the situations that it tests for almost
never happen (being race conditions). So we have a special test
class, `EventsRegisterTest`, that is specifically designed to test
this function by ensuring the possible race condition always happens.
In particular, it does the following:
### Testing
The design above achieves everything we desire, at the cost that we
need to write a correct `apply_events` function. This is a difficult
function to implement correctly, because the situations that it tests
for almost never happen (being race conditions). So we have a special
test class, `EventsRegisterTest`, that is specifically designed to
test this function by ensuring the possible race condition always
happens. In particular, it does the following:
* Call `fetch_initial_state_data` to get the current state.
* Call a state change function that issues an event,
e.g. `do_change_full_name`, and capture any events that are generated.
* Call `apply_events(state, events)`, and compare the result to
calling `fetch_initial_state_data` again now.
* Call `apply_events(state, events)`, and compare the resulting
"hybrid state" to what one would get from calling
`fetch_initial_state_data` again now.
The `apply_events` code is correct if those two results are identical.
The `EventsRegisterTest` tests in `test_events` will print a diff
between the "hybrid state" and the "normal state" obtained from
calling `fetch_initial_state_data` after the changes. Those tests
also inspect the events generated to ensure they have the expected
format and `do_test` has the `state_change_expected` and `num_events`
arguments that configure how many events that it asserts were
generated and whether it expects the state after applying the events
to differ what what it was before (which help catch common classes of
bugs).
The final detail we need to ensure that `apply_events` always works
correctly is to make sure that we have `EventsRegisterTest` tests for

View File

@@ -46,9 +46,11 @@ However, if you would like to fix the orientation of a hotspot popover, a
### Step 3: Test manually
To test your hotspot in the development environment, set
`ALWAYS_SEND_ALL_HOTSPOTS = True` in `zproject/dev_settings.py`,
and invoke `hotspots.initialize()` in your browser
console. Every hotspot should be displayed.
`ALWAYS_SEND_ALL_HOTSPOTS = True` in `zproject/dev_settings.py`, and
invoke `hotspots.initialize()` in your browser console. Every hotspot
should be displayed. Note that this setting has a bug that can result
in multiple copies of hotspots appearing; you can clear that by
reloading the browser.
Here are some visual characteristics to confirm:
- popover content is readable

View File

@@ -51,6 +51,14 @@ iterative development, but you can override this behavior with the
the `--rerun` option, which will rerun just the tests that failed in
the last test run.
**Webhook integrations**. For performance, `test-backend` with no
arguments will not run webhook integration tests (`zerver/webhooks/`),
which would otherwise account for about 25% of the total runtime.
When working on webhooks, we recommend instead running `test-backend
zerver/webhooks` manually (or better, the direction for the specific
webhooks you're working on). And of course our CI is configured to
always use `test-backend --include-webhooks` and run all of the tests.
## Writing tests
Before you write your first tests of Zulip, it is worthwhile to read

View File

@@ -668,12 +668,3 @@ documenting the feature to `templates/zerver/help/` in the main Zulip
server repository, where the source for Zulip's user documentation is
stored. For information on writing user documentation, see
[Zulip's general user guide documentation](../subsystems/user-docs.html).
For a more concrete example of writing documentation for a new
feature, see [an example commit in the Zulip repo][example-commit]
that documented a realm feature, [the current source][example-current-source],
and [the final rendered documentation][example-docs].
[example-commit]: https://github.com/zulip/zulip/commit/ce1875533e27a6ec5aab02260dde5f76976ff326
[example-current-source]: https://github.com/zulip/zulip/blob/master/templates/zerver/help/manage-who-can-join-and-invite.md
[example-docs]: https://chat.zulip.org/help/manage-who-can-join-and-invite

View File

@@ -35,6 +35,10 @@ const _scroll_util = {
scroll_element_into_container: () => {},
};
const _pm_list = {
update_private_messages: () => {},
};
const _popovers = {
hide_all_except_userlist_sidebar: function () {},
hide_all: function () {},
@@ -67,6 +71,7 @@ set_global('document', _document);
set_global('feature_flags', _feature_flags);
set_global('keydown_util', _keydown_util);
set_global('page_params', _page_params);
set_global('pm_list', _pm_list);
set_global('popovers', _popovers);
set_global('reload_state', _reload_state);
set_global('resize', _resize);
@@ -173,7 +178,7 @@ run_test('get_status', () => {
run_test('reload_defaults', () => {
blueslip.set_test_data('warn', 'get_filter_text() is called before initialization');
assert.equal(activity.get_filter_text(), '');
assert(blueslip.get_test_logs('warn').length, 1);
assert.equal(blueslip.get_test_logs('warn').length, 1);
blueslip.clear_test_data();
});
@@ -286,7 +291,7 @@ run_test('huddle_fraction_present', () => {
presence.presence_info = presence_info;
assert.equal(
activity.huddle_fraction_present(huddle),
buddy_data.huddle_fraction_present(huddle),
'0.50');
huddle = 'alice@zulip.com,fred@zulip.com,jill@zulip.com,mark@zulip.com';
@@ -299,7 +304,7 @@ run_test('huddle_fraction_present', () => {
presence.presence_info = presence_info;
assert.equal(
activity.huddle_fraction_present(huddle),
buddy_data.huddle_fraction_present(huddle),
false);
});
@@ -607,7 +612,7 @@ run_test('insert_one_user_into_empty_list', () => {
clear_buddy_list();
activity.redraw_user(alice.user_id);
assert(appended_html.indexOf('data-user-id="1"') > 0);
assert(appended_html.indexOf('user_active') > 0);
assert(appended_html.indexOf('user_circle_green') > 0);
});
reset_setup();
@@ -622,11 +627,11 @@ run_test('insert_alice_then_fred', () => {
activity.redraw_user(alice.user_id);
assert(appended_html.indexOf('data-user-id="1"') > 0);
assert(appended_html.indexOf('user_active') > 0);
assert(appended_html.indexOf('user_circle_green') > 0);
activity.redraw_user(fred.user_id);
assert(appended_html.indexOf('data-user-id="2"') > 0);
assert(appended_html.indexOf('user_active') > 0);
assert(appended_html.indexOf('user_circle_green') > 0);
});
reset_setup();
@@ -641,7 +646,7 @@ run_test('insert_fred_then_alice_then_rename', () => {
activity.redraw_user(fred.user_id);
assert(appended_html.indexOf('data-user-id="2"') > 0);
assert(appended_html.indexOf('user_active') > 0);
assert(appended_html.indexOf('user_circle_green') > 0);
var fred_stub = $.create('fred-first');
buddy_list_add(fred.user_id, fred_stub);
@@ -653,7 +658,7 @@ run_test('insert_fred_then_alice_then_rename', () => {
activity.redraw_user(alice.user_id);
assert(inserted_html.indexOf('data-user-id="1"') > 0);
assert(inserted_html.indexOf('user_active') > 0);
assert(inserted_html.indexOf('user_circle_green') > 0);
// Next rename fred to Aaron.
const fred_with_new_name = {
@@ -811,8 +816,8 @@ run_test('update_presence_info', () => {
blueslip.set_test_data('warn', 'unknown email: foo@bar.com');
blueslip.set_test_data('error', 'Unknown email for get_user_id: foo@bar.com');
activity.update_presence_info('foo@bar.com', info, server_time);
assert(blueslip.get_test_logs('warn').length, 1);
assert(blueslip.get_test_logs('error').length, 1);
assert.equal(blueslip.get_test_logs('warn').length, 1);
assert.equal(blueslip.get_test_logs('error').length, 1);
blueslip.clear_test_data();
});

View File

@@ -77,6 +77,20 @@ function activate_people() {
make_people();
activate_people();
run_test('user_circle', () => {
assert.equal(buddy_data.get_user_circle_class(selma.user_id), 'user_circle_green');
user_status.set_away(selma.user_id);
assert.equal(buddy_data.get_user_circle_class(selma.user_id), 'user_circle_empty_line');
user_status.revoke_away(selma.user_id);
assert.equal(buddy_data.get_user_circle_class(selma.user_id), 'user_circle_green');
assert.equal(buddy_data.get_user_circle_class(me.user_id), 'user_circle_green');
user_status.set_away(me.user_id);
assert.equal(buddy_data.get_user_circle_class(me.user_id), 'user_circle_empty_line');
user_status.revoke_away(me.user_id);
assert.equal(buddy_data.get_user_circle_class(me.user_id), 'user_circle_green');
});
run_test('buddy_status', () => {
assert.equal(buddy_data.buddy_status(selma.user_id), 'active');
user_status.set_away(selma.user_id);
@@ -143,7 +157,7 @@ run_test('bulk_data_hacks', () => {
run_test('level', () => {
assert.equal(buddy_data.my_user_status(me.user_id), 'translated: (you)');
user_status.set_away(me.user_id);
assert.equal(buddy_data.my_user_status(me.user_id), 'translated: (away)');
assert.equal(buddy_data.my_user_status(me.user_id), 'translated: (unavailable)');
user_status.revoke_away(me.user_id);
assert.equal(buddy_data.my_user_status(me.user_id), 'translated: (you)');
});

View File

@@ -106,6 +106,31 @@ run_test('smart_insert', () => {
assert.equal(textbox.val(), ':octopus: abc :smile: :airplane: :heart: ');
assert(textbox.focused);
// Test handling of spaces for ```quote
textbox = make_textbox('');
textbox.caret(0);
textbox.blur();
compose_ui.smart_insert(textbox, '```quote\nquoted message\n```\n');
assert.equal(textbox.insert_text, '```quote\nquoted message\n```\n');
assert.equal(textbox.val(), '```quote\nquoted message\n```\n');
assert(textbox.focused);
textbox = make_textbox('');
textbox.caret(0);
textbox.blur();
compose_ui.smart_insert(textbox, "[Quoting…]\n");
assert.equal(textbox.insert_text, '[Quoting…]\n');
assert.equal(textbox.val(), '[Quoting…]\n');
assert(textbox.focused);
textbox = make_textbox('abc');
textbox.caret(3);
textbox.blur();
compose_ui.smart_insert(textbox, " test with space");
assert.equal(textbox.insert_text, ' test with space ');
assert.equal(textbox.val(), 'abc test with space ');
assert(textbox.focused);
// Note that we don't have any special logic for strings that are
// already surrounded by spaces, since we are usually inserting things
// like emojis and file links.

View File

@@ -316,7 +316,7 @@ run_test('content_typeahead_selected', () => {
var document_stub_trigger1_called = false;
$('document-stub').trigger = function (event, params) {
assert.equal(event, 'usermention_completed.zulip');
assert.deepEqual(params, { mentioned: othello });
assert.deepEqual(params, { mentioned: othello, is_silent: false });
document_stub_trigger1_called = true;
};
@@ -326,6 +326,12 @@ run_test('content_typeahead_selected', () => {
expected_value = '@**Othello, the Moor of Venice** ';
assert.equal(actual_value, expected_value);
fake_this.query = 'Hello @oth';
fake_this.token = 'oth';
actual_value = ct.content_typeahead_selected.call(fake_this, othello);
expected_value = 'Hello @**Othello, the Moor of Venice** ';
assert.equal(actual_value, expected_value);
fake_this.query = '@**oth';
fake_this.token = 'oth';
actual_value = ct.content_typeahead_selected.call(fake_this, othello);
@@ -343,26 +349,32 @@ run_test('content_typeahead_selected', () => {
var document_stub_trigger3_called = false;
$('document-stub').trigger = function (event, params) {
assert.equal(event, 'usermention_completed.zulip');
assert.deepEqual(params, { mentioned: hamlet });
assert.deepEqual(params, { mentioned: hamlet, is_silent: true });
document_stub_trigger3_called = true;
};
fake_this.query = '_@kin';
fake_this.query = '@_kin';
fake_this.token = 'kin';
actual_value = ct.content_typeahead_selected.call(fake_this, hamlet);
expected_value = '_@**King Hamlet** ';
expected_value = '@_**King Hamlet** ';
assert.equal(actual_value, expected_value);
fake_this.query = '_@*kin';
fake_this.query = 'Hello @_kin';
fake_this.token = 'kin';
actual_value = ct.content_typeahead_selected.call(fake_this, hamlet);
expected_value = '_@**King Hamlet** ';
expected_value = 'Hello @_**King Hamlet** ';
assert.equal(actual_value, expected_value);
fake_this.query = '_@**kin';
fake_this.query = '@_*kin';
fake_this.token = 'kin';
actual_value = ct.content_typeahead_selected.call(fake_this, hamlet);
expected_value = '_@**King Hamlet** ';
expected_value = '@_**King Hamlet** ';
assert.equal(actual_value, expected_value);
fake_this.query = '@_**kin';
fake_this.token = 'kin';
actual_value = ct.content_typeahead_selected.call(fake_this, hamlet);
expected_value = '@_**King Hamlet** ';
assert.equal(actual_value, expected_value);
// user group mention
@@ -400,6 +412,12 @@ run_test('content_typeahead_selected', () => {
expected_value = '#**Sweden** ';
assert.equal(actual_value, expected_value);
fake_this.query = 'Hello #swed';
fake_this.token = 'swed';
actual_value = ct.content_typeahead_selected.call(fake_this, sweden_stream);
expected_value = 'Hello #**Sweden** ';
assert.equal(actual_value, expected_value);
fake_this.query = '#**swed';
fake_this.token = 'swed';
actual_value = ct.content_typeahead_selected.call(fake_this, sweden_stream);
@@ -415,6 +433,12 @@ run_test('content_typeahead_selected', () => {
expected_value = '~~~python\n\n~~~';
assert.equal(actual_value, expected_value);
fake_this.query = 'Hello ~~~p';
fake_this.token = 'p';
actual_value = ct.content_typeahead_selected.call(fake_this, 'python');
expected_value = 'Hello ~~~python\n\n~~~';
assert.equal(actual_value, expected_value);
fake_this.query = '```p';
fake_this.token = 'p';
actual_value = ct.content_typeahead_selected.call(fake_this, 'python');
@@ -1110,7 +1134,8 @@ run_test('begins_typeahead', () => {
};
});
var people_with_all = global.people.get_realm_persons().concat(all_items);
var people_only = global.people.get_realm_persons();
var people_with_all = people_only.concat(all_items);
var all_mentions = people_with_all.concat(global.user_groups.get_realm_user_groups());
var lang_list = Object.keys(pygments_data.langs);
@@ -1128,39 +1153,39 @@ run_test('begins_typeahead', () => {
assert_typeahead_equals("#foo\n~~~py", lang_list);
assert_typeahead_equals("@", false);
assert_typeahead_equals("_@", false);
assert_typeahead_equals("@_", false);
assert_typeahead_equals(" @", false);
assert_typeahead_equals(" _@", false);
assert_typeahead_equals(" @_", false);
assert_typeahead_equals("test @**o", all_mentions);
assert_typeahead_equals("test _@**o", all_mentions);
assert_typeahead_equals("test @_**o", people_only);
assert_typeahead_equals("test @*o", all_mentions);
assert_typeahead_equals("test _@*k", all_mentions);
assert_typeahead_equals("test @_*k", people_only);
assert_typeahead_equals("test @*h", all_mentions);
assert_typeahead_equals("test _@*h", all_mentions);
assert_typeahead_equals("test @_*h", people_only);
assert_typeahead_equals("test @", false);
assert_typeahead_equals("test _@", false);
assert_typeahead_equals("test @_", false);
assert_typeahead_equals("test no@o", false);
assert_typeahead_equals("test no_@k", false);
assert_typeahead_equals("test no@_k", false);
assert_typeahead_equals("@ ", false);
assert_typeahead_equals("_@ ", false);
assert_typeahead_equals("@_ ", false);
assert_typeahead_equals("@* ", false);
assert_typeahead_equals("_@* ", false);
assert_typeahead_equals("@_* ", false);
assert_typeahead_equals("@** ", false);
assert_typeahead_equals("_@** ", false);
assert_typeahead_equals("@_** ", false);
assert_typeahead_equals("test\n@i", all_mentions);
assert_typeahead_equals("test\n_@i", all_mentions);
assert_typeahead_equals("test\n@_i", people_only);
assert_typeahead_equals("test\n @l", all_mentions);
assert_typeahead_equals("test\n _@l", all_mentions);
assert_typeahead_equals("test\n @_l", people_only);
assert_typeahead_equals("@zuli", all_mentions);
assert_typeahead_equals("_@zuli", all_mentions);
assert_typeahead_equals("@_zuli", people_only);
assert_typeahead_equals("@ zuli", false);
assert_typeahead_equals("_@ zuli", false);
assert_typeahead_equals("@_ zuli", false);
assert_typeahead_equals(" @zuli", all_mentions);
assert_typeahead_equals(" _@zuli", all_mentions);
assert_typeahead_equals(" @_zuli", people_only);
assert_typeahead_equals("test @o", all_mentions);
assert_typeahead_equals("test _@k", all_mentions);
assert_typeahead_equals("test @_o", people_only);
assert_typeahead_equals("test @z", all_mentions);
assert_typeahead_equals("test _@z", all_mentions);
assert_typeahead_equals("test @_z", people_only);
assert_typeahead_equals(":", false);
assert_typeahead_equals(": ", false);

View File

@@ -296,6 +296,16 @@ var event_fixtures = {
},
},
realm__update_dict__night_logo: {
type: 'realm',
op: 'update_dict',
property: 'night_logo',
data: {
night_logo_url: 'night_logo.png',
night_logo_source: 'U',
},
},
realm__deactivated: {
type: 'realm',
op: 'deactivated',
@@ -940,6 +950,12 @@ with_overrides(function (override) {
assert_same(page_params.realm_logo_url, 'logo.png');
assert_same(page_params.realm_logo_source, 'U');
event = event_fixtures.realm__update_dict__night_logo;
override('realm_logo.rerender', noop);
dispatch(event);
assert_same(page_params.realm_night_logo_url, 'night_logo.png');
assert_same(page_params.realm_night_logo_source, 'U');
event = event_fixtures.realm__deactivated;
window.location = {};
dispatch(event);
@@ -1336,6 +1352,7 @@ with_overrides(function (override) {
event = event_fixtures.update_display_settings__night_mode;
page_params.night_mode = false;
override('night_mode.enable', stub.f); // automatically checks if called
override('realm_logo.rerender', noop);
dispatch(event);
assert_same(page_params.night_mode, true);
});

View File

@@ -7,6 +7,8 @@ zrequire('XDate', 'xdate');
zrequire('timerender');
zrequire('Handlebars', 'handlebars');
zrequire('util');
zrequire('stream_color');
zrequire('colorspace');
var ls_container = {};
var noop = function () { return; };
@@ -231,6 +233,8 @@ run_test('remove_old_drafts', () => {
});
run_test('format_drafts', () => {
drafts.remove_old_drafts = noop;
draft_1.updatedAt = new Date(1549958107000).getTime(); // 2/12/2019 07:55:07 AM (UTC+0)
draft_2.updatedAt = new Date(1549958107000).setDate(-1);
var draft_3 = {
@@ -257,27 +261,14 @@ run_test('format_drafts', () => {
var expected = [
{
draft_id: 'id3',
draft_id: 'id1',
is_stream: true,
stream: 'stream 2',
stream: 'stream',
stream_color: '#FFFFFF',
dark_background: '',
topic: 'topic',
raw_content: 'Test Stream Message 2',
time_stamp: 'Jan 21',
},
{
draft_id: 'id4',
is_stream: false,
recipients: 'aaron',
raw_content: 'Test Private Message 2',
time_stamp: 'Jan 26',
},
{
draft_id: 'id5',
is_stream: false,
recipients: 'aaron',
raw_content: 'Test Private Message 3',
time_stamp: 'Jan 29',
raw_content: 'Test Stream Message',
time_stamp: '7:55 AM',
},
{
draft_id: 'id2',
@@ -287,13 +278,28 @@ run_test('format_drafts', () => {
time_stamp: 'Jan 30',
},
{
draft_id: 'id1',
draft_id: 'id5',
is_stream: false,
recipients: 'aaron',
raw_content: 'Test Private Message 3',
time_stamp: 'Jan 29',
},
{
draft_id: 'id4',
is_stream: false,
recipients: 'aaron',
raw_content: 'Test Private Message 2',
time_stamp: 'Jan 26',
},
{
draft_id: 'id3',
is_stream: true,
stream: 'stream',
stream: 'stream 2',
stream_color: '#FFFFFF',
dark_background: '',
topic: 'topic',
raw_content: 'Test Stream Message',
time_stamp: '7:55 AM',
raw_content: 'Test Stream Message 2',
time_stamp: 'Jan 21',
},
];

View File

@@ -302,10 +302,10 @@ run_test('marked', () => {
expected: '<p><span aria-label="poop" class="emoji emoji-1f4a9" role="img" title="poop">:poop:</span></p>'},
{input: '\u{1f6b2}',
expected: '<p>\u{1f6b2}</p>' },
{input: 'Silent mention: _@**Cordelia Lear**',
expected: '<p>Silent mention: <span class="user-mention silent" data-user-id="101">@Cordelia Lear</span></p>'},
{input: 'Silent mention: @_**Cordelia Lear**',
expected: '<p>Silent mention: <span class="user-mention silent" data-user-id="101">Cordelia Lear</span></p>'},
{input: '> Mention in quote: @**Cordelia Lear**\n\nMention outside quote: @**Cordelia Lear**',
expected: '<blockquote>\n<p>Mention in quote: <span class="user-mention silent" data-user-id="101">@Cordelia Lear</span></p>\n</blockquote>\n<p>Mention outside quote: <span class="user-mention" data-user-id="101">@Cordelia Lear</span></p>'},
expected: '<blockquote>\n<p>Mention in quote: <span class="user-mention silent" data-user-id="101">Cordelia Lear</span></p>\n</blockquote>\n<p>Mention outside quote: <span class="user-mention" data-user-id="101">@Cordelia Lear</span></p>'},
// Test only those realm filters which don't return True for
// `contains_backend_only_syntax()`. Those which return True
// are tested separately.
@@ -519,6 +519,19 @@ run_test('python_to_js_filter', () => {
var actual_value = marked.InlineLexer.rules.zulip.realm_filters;
var expected_value = [/\/aa\/g(?![\w])/gim, /\/aa\/g(?![\w])/g];
assert.deepEqual(actual_value, expected_value);
// Test case with multiple replacements.
markdown.set_realm_filters([['#cf(?P<contest>[0-9]+)(?P<problem>[A-Z][0-9A-Z]*)', 'http://google.com']]);
actual_value = marked.InlineLexer.rules.zulip.realm_filters;
expected_value = [/#cf([0-9]+)([A-Z][0-9A-Z]*)(?![\w])/g];
assert.deepEqual(actual_value, expected_value);
// Test incorrect syntax.
blueslip.set_test_data('error', 'python_to_js_filter: Invalid regular expression: /!@#@(!#&((!&(@#((?![\\w])/: Unterminated group');
markdown.set_realm_filters([['!@#@(!#&((!&(@#(', 'http://google.com']]);
actual_value = marked.InlineLexer.rules.zulip.realm_filters;
expected_value = [];
assert.deepEqual(actual_value, expected_value);
assert.equal(blueslip.get_test_logs('error').length, 1);
blueslip.clear_test_data();
});
run_test('katex_throws_unexpected_exceptions', () => {
@@ -526,6 +539,15 @@ run_test('katex_throws_unexpected_exceptions', () => {
blueslip.set_test_data('error', 'Error: some-exception');
var message = { raw_content: '$$a$$' };
markdown.apply_markdown(message);
assert(blueslip.get_test_logs('error').length, 1);
assert.equal(blueslip.get_test_logs('error').length, 1);
blueslip.clear_test_data();
});
run_test('misc_helpers', () => {
const elem = $('.user-mention');
markdown.set_name_in_mention_element(elem, 'Aaron');
assert.equal(elem.text(), '@Aaron');
elem.addClass('silent');
markdown.set_name_in_mention_element(elem, 'Aaron, but silent');
assert.equal(elem.text(), 'Aaron, but silent');
});

View File

@@ -126,7 +126,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert.deepEqual(result.rerender_groups, []);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
(function test_append_message_same_subject() {
@@ -151,7 +151,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert.deepEqual(result.rerender_groups, []);
assert_message_list_equal(result.append_messages, [message2]);
assert_message_list_equal(result.rerender_messages, [message1]);
assert_message_list_equal(result.rerender_messages_next_same_sender, [message1]);
}());
(function test_append_message_different_subject() {
@@ -177,7 +177,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert.deepEqual(result.rerender_groups, []);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
(function test_append_message_different_subject_and_days() {
@@ -203,7 +203,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert.deepEqual(result.rerender_groups, []);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
assert.equal(
message_group2.group_date_divider_html,
'900000000 - 1000000');
@@ -229,7 +229,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert.deepEqual(result.rerender_groups, []);
assert.deepEqual(result.append_messages, [message2]);
assert.deepEqual(result.rerender_messages, [message1]);
assert.deepEqual(result.rerender_messages_next_same_sender, [message1]);
assert(list._message_groups[0].message_containers[1].want_date_divider);
}());
@@ -256,7 +256,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert.deepEqual(result.rerender_groups, []);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
(function test_append_message_same_subject_me_message() {
@@ -282,7 +282,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert.deepEqual(result.rerender_groups, []);
assert_message_list_equal(result.append_messages, [message2]);
assert_message_list_equal(result.rerender_messages, [message1]);
assert_message_list_equal(result.rerender_messages_next_same_sender, [message1]);
}());
@@ -309,7 +309,7 @@ run_test('merge_message_groups', () => {
assert_message_groups_list_equal(result.rerender_groups,
[build_message_group([message2, message1])]);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
(function test_prepend_message_different_subject() {
@@ -334,7 +334,7 @@ run_test('merge_message_groups', () => {
assert_message_groups_list_equal(result.prepend_groups, [message_group2]);
assert.deepEqual(result.rerender_groups, []);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
(function test_prepend_message_different_subject_and_day() {
@@ -364,7 +364,7 @@ run_test('merge_message_groups', () => {
assert_message_groups_list_equal(result.prepend_groups, [message_group2]);
assert.deepEqual(result.rerender_groups, [message_group1]);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
(function test_prepend_message_different_day() {
@@ -393,7 +393,7 @@ run_test('merge_message_groups', () => {
assert.deepEqual(result.prepend_groups, []);
assert_message_groups_list_equal(result.rerender_groups, [message_group2]);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
(function test_prepend_message_historical() {
@@ -419,11 +419,15 @@ run_test('merge_message_groups', () => {
assert_message_groups_list_equal(result.prepend_groups, [message_group2]);
assert.deepEqual(result.rerender_groups, []);
assert.deepEqual(result.append_messages, []);
assert.deepEqual(result.rerender_messages, []);
assert.deepEqual(result.rerender_messages_next_same_sender, []);
}());
});
// TODO: Add a test suite for rerender_messages_next_same_sender() that includes cases
// where new messages added via local echo have a different date from
// the older messages.
run_test('render_windows', () => {
// We only render up to 400 messages at a time in our message list,
// and we only change the window (which is a range, really, with

View File

@@ -184,6 +184,12 @@ run_test('update_booleans', () => {
assert.equal(message.unread, true);
});
run_test('each', () => {
message_store.each((message) => {
assert(message.alerted !== undefined);
});
});
run_test('message_id_change', () => {
var message = {
sender_email: 'me@example.com',

View File

@@ -7,6 +7,9 @@ zrequire('stream_data');
zrequire('util');
zrequire('Filter', 'js/filter');
set_global('i18n', global.stub_i18n);
set_global('page_params', {
stop_words: ['what', 'about'],
});
zrequire('narrow');
@@ -153,9 +156,36 @@ run_test('show_empty_narrow_message', () => {
narrow.show_empty_narrow_message();
assert($('#non_existing_user').visible());
var display = $("#empty_search_stop_words_string");
var items = [];
display.append = (html) => {
items.push(html);
};
set_filter([['search', 'grail']]);
narrow.show_empty_narrow_message();
assert($('#empty_search_narrow_message').visible());
assert.equal(items.length, 2);
assert.equal(items[0], ' ');
assert.equal(items[1].text(), 'grail');
items = [];
display.append = (html) => {
if (html.text) {
items.push(html.selector + html.text());
}
};
set_filter([['search', 'what about grail']]);
narrow.show_empty_narrow_message();
assert($('#empty_search_narrow_message').visible());
assert.equal(items.length, 3);
assert.equal(items[0], '<del>what');
assert.equal(items[1], '<del>about');
assert.equal(items[2], '<span>grail');
});
run_test('narrow_to_compose_target', () => {

View File

@@ -833,7 +833,7 @@ run_test('initialize', () => {
assert(people.is_my_user_id(42));
var fetched_retiree = people.get_person_from_user_id(15);
assert(fetched_retiree.full_name, 'Retiree');
assert.equal(fetched_retiree.full_name, 'Retiree');
assert.equal(global.page_params.realm_users, undefined);
assert.equal(global.page_params.cross_realm_bots, undefined);

View File

@@ -4,6 +4,9 @@ set_global('narrow_state', {});
set_global('resize', {
resize_stream_filters_container: function () {},
});
set_global('ui', {
set_up_scrollbar: function () {},
});
set_global('stream_popover', {
hide_topic_popover: function () {},
});
@@ -14,6 +17,9 @@ set_global('popovers', {
hide_all: function () {},
});
zrequire('user_status');
zrequire('presence');
zrequire('buddy_data');
zrequire('hash_util');
zrequire('Handlebars', 'handlebars');
zrequire('templates');
@@ -48,7 +54,7 @@ run_test('get_conversation_li', () => {
run_test('close', () => {
var collapsed;
$('ul.expanded_private_messages').remove = function () {
$('#private-container').remove = function () {
collapsed = true;
};
pm_list.close();
@@ -86,6 +92,9 @@ run_test('build_private_messages_list', () => {
is_zero: false,
zoom_out_hide: false,
url: '#narrow/pm-with/101,102-group',
user_circle_class: 'user_circle_fraction',
fraction_present: false,
is_group: true,
},
],
zoom_class: 'zoomed-out',
@@ -118,7 +127,7 @@ run_test('build_private_messages_list', () => {
run_test('expand_and_update_private_messages', () => {
var collapsed;
$('ul.expanded_private_messages').remove = function () {
$('#private-container').remove = function () {
collapsed = true;
};

View File

@@ -135,7 +135,7 @@ run_test('sender_hover', () => {
templates.render = function (fn, opts) {
switch (fn) {
case 'user_info_popover':
case 'no_arrow_popover':
assert.deepEqual(opts, {
class: 'message-info-popover',
});
@@ -157,7 +157,7 @@ run_test('sender_hover', () => {
user_id: 42,
user_time: undefined,
user_type: i18n.t('Member'),
type: 'offline',
user_circle_class: 'user_circle_empty',
user_last_seen_time_status: 'translated: More than 2 weeks ago',
pm_with_uri: '#narrow/pm-with/42-alice',
sent_by_uri: '#narrow/sender/42-alice',

View File

@@ -73,5 +73,5 @@ run_test('create_pills', () => {
var pills = search_pill.create_pills({});
assert(input_pill_create_called);
assert(pills, {dummy: 'dummy'});
assert.deepEqual(pills, {dummy: 'dummy'});
});

View File

@@ -9,6 +9,7 @@ global.stub_out_jquery();
zrequire('message_store');
zrequire('server_events_dispatch');
zrequire('server_events');
zrequire('sent_messages');
set_global('blueslip', global.make_zblueslip());
set_global('channel', {});

View File

@@ -57,6 +57,7 @@ const _ui_report = {
const _realm_logo = {
build_realm_logo_widget: noop,
build_realm_night_logo_widget: noop,
};
set_global('channel', _channel);

View File

@@ -302,7 +302,7 @@ run_test('populate_user_groups', () => {
assert(user_groups_list_append_called);
assert(get_person_from_user_id_called);
assert(input_typeahead_called);
assert(blueslip.get_test_logs('warn').length, 1);
assert.equal(blueslip.get_test_logs('warn').length, 1);
blueslip.clear_test_data();
test_create_item(create_item_handler);

View File

@@ -281,9 +281,15 @@ run_test('subscribers', () => {
run_test('is_active', () => {
stream_data.clear_subscriptions();
var sub = {name: 'pets', subscribed: false, stream_id: 1};
var sub;
sub = {name: 'pets', subscribed: false, stream_id: 111};
stream_data.add_sub('pets', sub);
assert(stream_data.is_active(sub));
stream_data.set_filter_out_inactives(true);
assert(!stream_data.is_active(sub));
stream_data.subscribe_myself(sub);
@@ -639,6 +645,7 @@ run_test('initialize', () => {
initialize();
page_params.realm_notifications_stream_id = -1;
stream_data.initialize();
assert(!stream_data.is_filtering_inactives());
const stream_names = stream_data.get_streams_for_admin().map(elem => elem.name);
assert(stream_names.indexOf('subscriptions') !== -1);
@@ -667,6 +674,34 @@ run_test('initialize', () => {
assert.equal(page_params.notifications_stream, "foo");
});
run_test('filter inactives', () => {
page_params.unsubscribed = [];
page_params.never_subscribed = [];
page_params.subscriptions = [];
stream_data.initialize();
assert(!stream_data.is_filtering_inactives());
page_params.unsubscribed = [];
page_params.never_subscribed = [];
page_params.subscriptions = [];
_.times(30, function (i) {
var name = 'random' + i.toString();
var stream_id = 100 + i;
var sub = {
name: name,
subscribed: true,
newly_subscribed: false,
stream_id: stream_id,
};
stream_data.add_sub(name, sub);
});
stream_data.initialize();
assert(stream_data.is_filtering_inactives());
});
run_test('get_newbie_stream', () => {
var newbie = {
name: 'newbie',

View File

@@ -8,6 +8,7 @@ const noop = () => {};
set_global('resize', {
resize_page_components: noop,
resize_stream_filters_container: noop,
});
set_global('popovers', {});
@@ -38,31 +39,33 @@ function simulate_search_expanded() {
// The way we check if the search widget is expanded
// is kind of awkward.
$('#stream-filters-container .input-append.notdisplayed').length = 0;
$('.stream_search_section.notdisplayed').length = 0;
}
function simulate_search_collapsed() {
$('#stream-filters-container .input-append.notdisplayed').length = 1;
$('.stream_search_section.notdisplayed').length = 1;
}
function toggle_filter() {
stream_list.toggle_filter_displayed({preventDefault: noop});
}
function clear_search_input() {
stream_list.clear_search({stopPropagation: noop});
}
run_test('basics', () => {
var cursor_helper;
const input = $('.stream-list-filter');
const header = $.create('header stub');
input.parent = () => header;
const section = $('.stream_search_section');
expand_sidebar();
header.addClass('notdisplayed');
section.addClass('notdisplayed');
cursor_helper = make_cursor_helper();
function verify_expanded() {
assert(!header.hasClass('notdisplayed'));
assert(!section.hasClass('notdisplayed'));
simulate_search_expanded();
}
@@ -77,7 +80,7 @@ run_test('basics', () => {
}
function verify_collapsed() {
assert(header.hasClass('notdisplayed'));
assert(section.hasClass('notdisplayed'));
assert(!input.is_focused());
assert(!stream_list.searching());
simulate_search_collapsed();
@@ -130,7 +133,7 @@ run_test('basics', () => {
verify_focused();
// Clear an empty search.
stream_list.clear_search();
clear_search_input();
verify_collapsed();
// Expand the widget.
@@ -140,7 +143,7 @@ run_test('basics', () => {
// Clear a non-empty search.
input.val('foo');
verify_list_updated(() => {
stream_list.clear_search();
clear_search_input();
});
verify_expanded();

View File

@@ -294,9 +294,6 @@ run_test('admin_invites_list', () => {
var span = $(html).find(".email:first");
assert.equal(span.text(), "alice@zulip.com");
var icon = $(html).find(".fa-bolt");
assert.equal(icon.attr('title'), "translated: Invited as administrator");
});
run_test('admin_tab', () => {
@@ -646,8 +643,6 @@ run_test('draft_table_body', () => {
assert.equal(row_1.find(".stream_label").css("background"), "rgb(255, 0, 0)");
assert.equal(row_1.find(".stream_topic").text().trim(), "tests");
assert(!row_1.find(".message_row").hasClass("private-message"));
assert.equal(row_1.find(".messagebox").css("box-shadow"),
"inset 2px 0px 0px 0px #FF0000, -1px 0px 0px 0px #FF0000");
assert.equal(row_1.find(".message_content").text().trim(), "Public draft");
var row_2 = $(html).find(".draft-row[data-draft-id='2']");
@@ -1052,6 +1047,18 @@ run_test('reminder_popover_content', () => {
assert.equal(link.text().trim(), 'translated: Select date and time');
});
run_test('revoke_invite_modal', () => {
var args = {
is_multiuse: false,
email: "iago@zulip.com",
};
var html = "<div>";
html += render('revoke-invite-modal', args);
html += "</div>";
assert.equal($(html).find("p strong").text(), "iago@zulip.com");
});
run_test('settings_tab', () => {
var page_param_checkbox_options = {
enable_stream_desktop_notifications: true,
@@ -1415,19 +1422,16 @@ run_test('user_group_info_popover_content', () => {
group_description: 'groupDescription',
members: [
{
presence_status: 'active',
full_name: 'Active Alice',
user_last_seen_time_status: 'time',
is_bot: false,
},
{
presence_status: 'offline',
full_name: 'Bot Bob',
user_last_seen_time_status: 'time',
is_bot: true,
},
{
presence_status: 'offline',
full_name: 'Inactive Imogen',
user_last_seen_time_status: 'time',
is_bot: false,
@@ -1438,8 +1442,6 @@ run_test('user_group_info_popover_content', () => {
var html = render('user_group_info_popover_content', args);
var allUsers = $(html).find("li");
assert.equal(allUsers[0].classList.contains("user_active"), true);
assert.equal(allUsers[2].classList.contains("user_offline"), true);
assert.equal($(allUsers[0]).text().trim(), 'Active Alice');
assert.equal($(allUsers[1]).text().trim(), 'Bot Bob');
assert.equal($(allUsers[2]).text().trim(), 'Inactive Imogen');
@@ -1448,8 +1450,8 @@ run_test('user_group_info_popover_content', () => {
assert.equal($(html).find('.group-description').text().trim(), 'groupDescription');
});
run_test('user_info_popover', () => {
var html = render('user_info_popover', {class: 'message-info-popover'});
run_test('no_arrow_popover', () => {
var html = render('no_arrow_popover', {class: 'message-info-popover'});
$(html).hasClass('popover message-info-popover');
});

View File

@@ -50,14 +50,14 @@ run_test('user_groups', () => {
blueslip.set_test_data('error', 'Unknown group_id in get_user_group_from_id: ' + all.id);
assert.equal(user_groups.get_user_group_from_id(all.id), undefined);
assert(blueslip.get_test_logs('error').length, 1);
assert.equal(blueslip.get_test_logs('error').length, 1);
blueslip.clear_test_data();
user_groups.remove(students);
blueslip.set_test_data('error', 'Unknown group_id in get_user_group_from_id: ' + students.id);
assert.equal(user_groups.get_user_group_from_id(students.id), undefined);
assert(blueslip.get_test_logs('error').length, 1);
assert.equal(blueslip.get_test_logs('error').length, 1);
blueslip.clear_test_data();
assert.equal(user_groups.get_user_group_from_name(all.name), undefined);
@@ -92,6 +92,6 @@ run_test('user_groups', () => {
blueslip.set_test_data('error', 'Could not find user group with ID -1');
assert.equal(user_groups.is_member_of(-1, 15), false);
assert(blueslip.get_test_logs('error').length, 1);
assert.equal(blueslip.get_test_logs('error').length, 1);
blueslip.clear_test_data();
});

View File

@@ -110,7 +110,7 @@ run_test('robust_uri_decode', () => {
try {
util.robust_uri_decode('%E0%A4%A');
} catch (e) {
assert(e, 'foo');
assert.equal(e, 'foo');
}
});

View File

@@ -43,9 +43,9 @@
"string.prototype.startswith": "0.2.0",
"style-loader": "0.21.0",
"to-markdown": "3.1.0",
"ts-loader": "4.3.0",
"ts-node": "3.3.0",
"typescript": "2.8.3",
"ts-loader": "5.3.3",
"ts-node": "8.0.2",
"typescript": "3.3.1",
"underscore": "1.9.0",
"webfonts-generator": "0.4.0",
"webpack": "4.8.3",
@@ -69,7 +69,7 @@
"stylelint": "9.3.0",
"svgo": "1.0.5",
"swagger-parser": "3.4.1",
"tslint": "5.10.0",
"tslint": "5.12.1",
"webpack-dev-server": "3.1.4",
"xmlhttprequest": "1.8.0"
},

View File

@@ -2,6 +2,7 @@
<% else -%>
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
<% end -%>
@@ -11,8 +12,10 @@ include /etc/nginx/zulip-include/upstreams;
server {
<% if @nginx_http_only != '' -%>
listen 80;
listen [::]:80;
<% else -%>
listen 443;
listen [::]:443;
ssl on;
ssl_certificate <%= @ssl_dir %>/certs/zulip.combined-chain.crt;

View File

@@ -7,6 +7,7 @@ chmod-socket=700
chown-socket=zulip:zulip
processes=<%= @uwsgi_processes %>
harakiri=20
buffer-size=8192
post-buffering=4096
env= LANG=en_US.UTF-8
uid=zulip

View File

@@ -48,8 +48,6 @@ import logging
import logging.handlers
import subprocess
import sys
import boto.utils
import netifaces
if False:

View File

@@ -3,7 +3,7 @@
# and requirements/prod.txt.
# See requirements/README.md for more detail.
# Django itself
Django==1.11.18
Django==1.11.20
# needed for mypy TypedDict
mypy_extensions==0.4.1
@@ -78,6 +78,9 @@ httplib2==0.12.0
# Needed for hipchat import
hypchat==0.21
# For doing highly usable Python profiling
line_profiler==2.1.2
# Needed for inlining the CSS in emails
premailer==3.2.0
@@ -175,8 +178,8 @@ pyoembed==0.1.2
# these tightly, including fetching content not included in the normal
# release tarballs (which is a bug). So we need to pin it makes sense
# to pin a version from Git rather than a release.
-e "git+https://github.com/zulip/python-zulip-api.git@0.5.8#egg=zulip==0.5.8_git&subdirectory=zulip"
-e "git+https://github.com/zulip/python-zulip-api.git@0.5.8#egg=zulip_bots==0.5.8+git&subdirectory=zulip_bots"
-e "git+https://github.com/zulip/python-zulip-api.git@0.5.9#egg=zulip==0.5.9_git&subdirectory=zulip"
-e "git+https://github.com/zulip/python-zulip-api.git@0.5.9#egg=zulip_bots==0.5.9+git&subdirectory=zulip_bots"
# Used for Hesiod lookups, etc.
py3dns==3.2.0

View File

@@ -13,8 +13,8 @@ git+https://github.com/zulip/django-bitfield@0d2b15cdb5af5ddec88d41cac19c0f2ce1b
git+https://github.com/zulip/libthumbor.git@60ed2431c07686a12f2770b2d852c5650f3ccfc6#egg=libthumbor==1.3.2zulip
git+https://github.com/zulip/talon.git@7d8bdc4dbcfcc5a73298747293b99fe53da55315#egg=talon==1.2.10.zulip1
git+https://github.com/zulip/ultrajson@70ac02bec#egg=ujson==1.35+git
git+https://github.com/zulip/python-zulip-api.git@0.5.8#egg=zulip==0.5.8_git&subdirectory=zulip
git+https://github.com/zulip/python-zulip-api.git@0.5.8#egg=zulip_bots==0.5.8+git&subdirectory=zulip_bots
git+https://github.com/zulip/python-zulip-api.git@0.5.9#egg=zulip==0.5.9_git&subdirectory=zulip
git+https://github.com/zulip/python-zulip-api.git@0.5.9#egg=zulip_bots==0.5.9+git&subdirectory=zulip_bots
alabaster==0.7.12
apns2==0.4.1
argon2-cffi==19.1.0
@@ -56,7 +56,7 @@ django-sendfile==0.3.11
django-statsd-mozilla==0.4.0
django-two-factor-auth==1.8.0
django-webpack-loader==0.6.0
django==1.11.18
django==1.11.20
docker-pycreds==0.4.0 # via docker
docker==3.7.0 # via moto
docopt==0.6.2
@@ -90,6 +90,7 @@ jinja2==2.10
jmespath==0.9.3 # via boto3, botocore
jsondiff==1.1.1 # via moto
jsonpickle==1.1 # via aws-xray-sdk, python-digitalocean
line_profiler==2.1.2
lxml==4.3.0
markdown-include==0.5.1
markdown==3.0.1

View File

@@ -13,8 +13,8 @@ git+https://github.com/zulip/django-bitfield@0d2b15cdb5af5ddec88d41cac19c0f2ce1b
git+https://github.com/zulip/libthumbor.git@60ed2431c07686a12f2770b2d852c5650f3ccfc6#egg=libthumbor==1.3.2zulip
git+https://github.com/zulip/talon.git@7d8bdc4dbcfcc5a73298747293b99fe53da55315#egg=talon==1.2.10.zulip1
git+https://github.com/zulip/ultrajson@70ac02bec#egg=ujson==1.35+git
git+https://github.com/zulip/python-zulip-api.git@0.5.8#egg=zulip==0.5.8_git&subdirectory=zulip
git+https://github.com/zulip/python-zulip-api.git@0.5.8#egg=zulip_bots==0.5.8+git&subdirectory=zulip_bots
git+https://github.com/zulip/python-zulip-api.git@0.5.9#egg=zulip==0.5.9_git&subdirectory=zulip
git+https://github.com/zulip/python-zulip-api.git@0.5.9#egg=zulip_bots==0.5.9+git&subdirectory=zulip_bots
apns2==0.4.1
argon2-cffi==19.1.0
asn1crypto==0.24.0 # via cryptography
@@ -45,7 +45,7 @@ django-sendfile==0.3.11
django-statsd-mozilla==0.4.0
django-two-factor-auth==1.8.0
django-webpack-loader==0.6.0
django==1.11.18
django==1.11.20
docopt==0.6.2
gitdb==0.6.4
google-api-python-client==1.7.4
@@ -64,6 +64,7 @@ ipython-genutils==0.2.0 # via traitlets
ipython==6.5.0
jedi==0.13.2 # via ipython
jinja2==2.10
line_profiler==2.1.2
lxml==4.3.0
markdown-include==0.5.1
markdown==3.0.1

View File

@@ -218,6 +218,16 @@ def try_to_copy_venv(venv_path, new_packages):
# virtualenv-clone isn't working, so just make a new venv
return False
# virtualenv-clone, unfortunately, copies the success stamp,
# which means if the upcoming `pip install` phase were to
# fail, we'd end up with a broken half-provisioned virtualenv
# that's incorrectly tagged as properly provisioned. The
# right fix is to use
# https://github.com/edwardgeorge/virtualenv-clone/pull/38,
# but this rm is almost as good.
success_stamp_path = os.path.join(venv_path, 'success-stamp')
run(["sudo", "rm", "-f", success_stamp_path])
run(["sudo", "chown", "-R",
"{}:{}".format(os.getuid(), os.getgid()), venv_path])
source_log = get_logfile_name(source_venv_path)

View File

@@ -99,7 +99,7 @@ chmod a+x "$CERTBOT_PATH"
# an annoying prompt we stifle with --no-eff-email.
"$CERTBOT_PATH" certonly "${method_args[@]}" \
"${HOSTNAMES[@]}" -m "$EMAIL" \
$agree_tos --force-renewal \
$agree_tos \
"${deploy_hook[@]}" \
--force-interactive --no-eff-email

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><path fill="#ffcc2a" d="M81.103 59.577c-3.088 0-6.275-.973-8.975-2.738l-15.1-10.295a3.743 3.743 0 0 1-1.635-3.097c0-1.24.61-2.4 1.635-3.098l14.961-10.2c2.807-1.841 6.022-2.832 9.113-2.832 8.03 0 12.822 6.031 12.822 16.131 0 10.101-4.792 16.131-12.822 16.131m-61.674-.002c-8.03 0-12.825-6.03-12.825-16.131 0-10.1 4.793-16.131 12.822-16.131 3.087 0 6.276.972 8.977 2.737l15.097 10.295a3.748 3.748 0 0 1 .002 6.195l-14.96 10.201c-2.812 1.841-6.027 2.832-9.115 2.832m30.837-18.429a3.743 3.743 0 0 1-2.111-.651l-14.211-9.69a3.75 3.75 0 0 1-1.542-3.936 19.169 19.169 0 0 1 2.421-5.856 31.072 31.072 0 0 0-1.962-2.925 6.824 6.824 0 0 1-1.313-5.097 6.811 6.811 0 0 1 2.677-4.528 6.79 6.79 0 0 1 4.126-1.382 6.905 6.905 0 0 1 5.497 2.743 45.76 45.76 0 0 1 2.087 3.008 17.81 17.81 0 0 1 9.418.216 45.581 45.581 0 0 1 2.225-3.227A6.911 6.911 0 0 1 63.07 7.08c1.501 0 2.927.475 4.128 1.38a6.813 6.813 0 0 1 2.677 4.533 6.842 6.842 0 0 1-1.312 5.095 29.967 29.967 0 0 0-2.392 3.683 18.979 18.979 0 0 1 1.96 5.102 3.758 3.758 0 0 1-1.542 3.931l-14.212 9.69a3.757 3.757 0 0 1-2.113.651m-.013 51.777A3.746 3.746 0 0 1 47.788 92L36.72 82.364c-5.566-4.487-9.113-11.531-9.732-19.343a3.747 3.747 0 0 1 1.877-3.552c.358-.205.717-.415 1.068-.643l18.218-12.423a3.744 3.744 0 0 1 4.226 0l18.362 12.516c.266.176.6.368.932.558a3.744 3.744 0 0 1 1.862 3.547c-.62 7.802-4.17 14.846-9.738 19.338l-11.083 9.641a3.748 3.748 0 0 1-2.461.92"/><path fill="#4d4c4e" d="M81.103 55.827c-2.368 0-4.856-.773-6.923-2.126L59.144 43.446l14.957-10.2c2.146-1.406 4.633-2.181 7.002-2.181 5.852 0 9.072 4.397 9.072 12.381 0 7.981-3.22 12.381-9.072 12.381M61.391 79.484l-10.316 8.973-.823.713-.817-.713-10.308-8.971c-4.831-3.867-7.865-10.025-8.401-16.762.426-.245.848-.493 1.261-.762l6.177-4.211 12.101-8.253 12.11 8.253 6.255 4.262c.377.251.776.481 1.168.711-.537 6.737-3.578 12.89-8.406 16.76M19.426 55.827c-5.847 0-9.072-4.4-9.072-12.381 0-7.983 3.225-12.381 9.072-12.381 2.368 0 4.856.775 6.926 2.127l15.04 10.253-14.961 10.201c-2.148 1.406-4.633 2.18-7.001 2.18h-.003zm17.047-44.371a3.125 3.125 0 0 1 4.375.62 39.868 39.868 0 0 1 3.407 5.315 14.087 14.087 0 0 1 12.721.366 40.178 40.178 0 0 1 3.593-5.681 3.121 3.121 0 0 1 2.5-1.247 3.122 3.122 0 0 1 2.494 5.004c-1.74 2.313-2.907 4.395-3.696 6.176a15.35 15.35 0 0 1 2.605 5.696l-14.211 9.69-14.211-9.69a15.365 15.365 0 0 1 3.17-6.401c-.775-1.618-1.848-3.455-3.37-5.471a3.129 3.129 0 0 1 .62-4.377m44.631 12.108c-3.161 0-6.411.845-9.341 2.381a22.758 22.758 0 0 0-1.322-4.008c.343-.527.72-1.062 1.122-1.6 3.521-4.677 2.576-11.355-2.103-14.875a10.556 10.556 0 0 0-6.387-2.135c-3.32 0-6.496 1.585-8.493 4.238a58.88 58.88 0 0 0-.915 1.256 21.37 21.37 0 0 0-3.398-.271c-.871 0-1.736.051-2.59.153-.271-.381-.55-.762-.832-1.138a10.673 10.673 0 0 0-8.491-4.238c-2.323 0-4.533.74-6.388 2.138-4.678 3.518-5.622 10.193-2.101 14.873.206.276.407.55.597.823a23.056 23.056 0 0 0-1.69 4.772c-2.911-1.531-6.161-2.371-9.342-2.371-7.643 0-16.572 5.205-16.572 19.881 0 14.673 8.928 19.881 16.572 19.881a19.15 19.15 0 0 0 3.818-.405c.003.131-.005.261.003.395.698 8.806 4.728 16.787 11.062 21.918l10.202 8.88.812.71a7.475 7.475 0 0 0 4.926 1.846 7.483 7.483 0 0 0 4.92-1.838l.82-.712 10.215-8.887c6.335-5.136 10.366-13.115 11.068-21.913.01-.133 0-.263.002-.395a19.25 19.25 0 0 0 3.826.402c7.646 0 16.572-5.207 16.572-19.881 0-14.676-8.926-19.881-16.572-19.881"/><path fill="#4d4c4e" d="M38.494 57.751c-.146.927-.253 1.875-.253 2.856 0 .398.036.788.063 1.183h23.91c.022-.395.056-.785.056-1.183 0-.978-.08-1.931-.217-2.856H38.495zm5.441 15.81l.133.112.581.505h11.213l.71-.617c1.057-.84 1.972-1.87 2.756-3.02H41.18c.786 1.15 1.696 2.182 2.753 3.02"/></svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -0,0 +1 @@
<svg width="256" height="231" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><defs><linearGradient x1="108.633%" y1="13.818%" x2="46.927%" y2="78.776%" id="a"><stop stop-color="#0052CC" offset="18%"/><stop stop-color="#2684FF" offset="100%"/></linearGradient></defs><g fill="none"><path d="M101.272 152.561h53.449l12.901-75.32H87.06z"/><path d="M8.308 0A8.202 8.202 0 0 0 .106 9.516l34.819 211.373a11.155 11.155 0 0 0 10.909 9.31h167.04a8.202 8.202 0 0 0 8.201-6.89l34.82-213.752a8.202 8.202 0 0 0-8.203-9.514L8.308 0zm146.616 152.768h-53.315l-14.436-75.42h80.67l-12.919 75.42z" fill="#2684FF"/><path d="M244.61 77.242h-76.916l-12.909 75.36h-53.272l-62.902 74.663a11.105 11.105 0 0 0 7.171 2.704H212.73a8.196 8.196 0 0 0 8.196-6.884l23.686-145.843z" fill="url(#a)"/></g></svg>

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" viewBox="0 0 288 224.3"><style id="style3">.st0{fill:#6515dd}</style><g id="g5" transform="translate(-144 -175.8)"><g id="g7"><g id="g9"><path class="st0" d="M164.9 358.3c-11.5 0-20.9 9.4-20.9 20.9 0 11.5 9.4 20.9 20.9 20.9 11.5 0 20.9-9.4 20.9-20.9 0-11.5-9.3-20.9-20.9-20.9z" id="path11" fill="#6515dd"/></g><path class="st0" d="M422.2 175.8l-131.6 42v-41.5l-141.9 45.3v120.3l122.4-39.1v41.3L432 292.8l-43.6-42.6 33.8-74.4zM271.1 282.2L168.3 315v-79.1l102.8-32.8v79.1zm124.5 1.7l-105 33.5v-79l96.7-30.9-22.2 46.8 30.5 29.6z" id="path13" fill="#6515dd"/></g></g></svg>

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="1.205 -0.893 146.076 187.57" width="142.08" height="183.57"><defs><path d="M144.28 40.13L73.26 81.15 2.2 40.13v82.03l35.53 20.49v41.03l106.55-61.52V40.13z" id="a"/><path d="M73.26 82.14L2.2 41.12 73.26.11l71.02 41.01-71.02 41.02z" id="b"/><path d="M72 80.89L2.65 40.85l-.45.27 71.06 41.02 71.02-41.02-1.67-.99L72 80.89z" id="c"/><path d="M73.26 82.65v-.51L2.65 41.36l-.45.27 71.06 41.02z" id="d"/></defs><use xlink:href="#a" fill="#ef6c00"/><use xlink:href="#a" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#b" fill="#ff9800"/><use xlink:href="#b" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#c" fill="#ff9800"/><use xlink:href="#c" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#d" fill="#ff9800"/><use xlink:href="#d" fill-opacity="0" stroke="#000" stroke-opacity="0"/></svg>

After

Width:  |  Height:  |  Size: 938 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -1 104 106"><g data-name="Layer 2"><g data-name="Layer 3"><path d="M51.87 0C23.71 0 0 22.83 0 51v52.81l51.86-.05c28.16 0 51-23.71 51-51.87S80 0 51.87 0z" fill="#231f20"/><path d="M52.37 19.74a31.62 31.62 0 0 0-27.79 46.67l-5.72 18.4 20.54-4.64a31.61 31.61 0 1 0 13-60.43z" fill="#fff9ae"/><path d="M77.45 32.12a31.6 31.6 0 0 1-38.05 48l-20.54 4.7 20.91-2.47a31.6 31.6 0 0 0 37.68-50.23z" fill="#00aeef"/><path d="M71.63 26.29A31.6 31.6 0 0 1 38.8 78l-19.94 6.82 20.54-4.65a31.6 31.6 0 0 0 32.23-53.88z" fill="#00a94f"/><path d="M26.47 67.11a31.61 31.61 0 0 1 51-35 31.61 31.61 0 0 0-52.89 34.3l-5.72 18.4z" fill="#f15d22"/><path d="M24.58 66.41a31.61 31.61 0 0 1 47.05-40.12 31.61 31.61 0 0 0-49 39.63l-3.76 18.9z" fill="#e31b23"/></g></g></svg>

After

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-0.921 210.038 228.723 221.823" width="224.72" height="217.82"><defs><path d="M205.23 383.31c-.42-6.57 1.43-13.93 3.29-19.29 1.15-2.5 2.15-5.07 3.07-7.65v-.07c20.08-56.67-9.57-118.91-66.31-138.99-56.74-20.08-118.84 9.65-138.92 66.32-20.08 56.66 9.58 118.91 66.32 138.99 31.29 11.07 65.95 7.29 94.11-10.36 2.86-1.36 5.29-2.15 6.64-1.58 14.44 6.08 30.23 7.94 45.67 5.22 2.71-.43 9.64-3 2.71-8.15-7-5.14-15.72-12.14-16.58-24.44z" id="a"/><path d="M150.07 270.55c6.79 0 12.29 5.5 12.29 12.29v.5c0 6.79-5.5 12.29-12.29 12.29H76.89c-6.79 0-12.29-5.5-12.29-12.29v-.5c0-6.79 5.5-12.29 12.29-12.29h73.18z" id="b"/><path d="M123.13 307.78c6.79 0 12.29 5.5 12.29 12.29v.57c0 6.79-5.5 12.29-12.29 12.29H76.89c-6.79 0-12.29-5.5-12.29-12.29v-.57c0-6.79 5.5-12.29 12.29-12.29h46.24z" id="c"/><path d="M85.25 344.37c6.79 0 12.29 5.5 12.29 12.29v.5c0 6.79-5.5 12.29-12.29 12.29h-8.36c-6.79 0-12.29-5.5-12.29-12.29v-.5c0-6.79 5.5-12.29 12.29-12.29h8.36z" id="d"/></defs><use xlink:href="#a" fill="#0abe51"/><use xlink:href="#a" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#b" fill="#fff"/><use xlink:href="#b" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#c" fill="#fff"/><use xlink:href="#c" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#d" fill="#fff"/><use xlink:href="#d" fill-opacity="0" stroke="#000" stroke-opacity="0"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 737 411"><path d="M491.7 312.8c-4.2 11.3-10.2 21-18 29.1-7.8 8.1-17.1 14.4-28 18.8s-22.9 6.7-36 6.7c-20.4 0-37.9-5.1-52.4-15.2s-24-23.9-28.5-41.5h29.6c2.9 6.4 6.5 11.6 11 15.5 4.4 3.9 9.2 6.8 14.2 8.8s9.8 3.3 14.5 4 8.5 1 11.7 1c10.9 0 20.1-1.9 27.8-5.8 7.7-3.9 13.9-8.9 18.6-15 4.8-6.1 8.2-13 10.3-20.8 2.1-7.8 3.2-15.5 3.2-23.3v-18c-6.2 8.4-14.4 15.6-24.5 21.5s-21.4 8.8-33.8 8.8-23.9-2.3-34.3-7-19.5-11.1-27.1-19.3c-7.7-8.2-13.7-17.8-18-28.6-4.3-10.9-6.5-22.5-6.5-35s2.2-24.1 6.5-35.1 10.3-20.5 18-28.6c7.7-8.1 16.7-14.5 27.1-19.3s21.9-7.2 34.3-7.2c12.7 0 24.2 3.1 34.6 9.3 10.4 6.2 18.6 13.7 24.6 22.3v-27.3h27.3v163.5c.2 13.8-1.9 26.4-6.2 37.7zm-26.6-139.9c-3.1-7.8-7.3-14.6-12.7-20.5-5.3-5.9-11.5-10.5-18.5-13.8-7-3.3-14.5-5-22.5-5s-15.5 1.7-22.6 5c-7.1 3.3-13.2 7.9-18.3 13.8-5.1 5.9-9.2 12.7-12.2 20.5-3 7.8-4.5 16.1-4.5 25 0 8.7 1.5 16.9 4.5 24.6 3 7.8 7 14.5 12.2 20.3 5.1 5.8 11.2 10.3 18.3 13.7 7.1 3.3 14.7 5 22.6 5 8 0 15.5-1.7 22.5-5s13.2-7.9 18.5-13.7c5.3-5.8 9.5-12.5 12.7-20.3 3.1-7.8 4.7-16 4.7-24.6 0-8.9-1.6-17.2-4.7-25zm173.3-58.4c10.5 4.8 19.6 11.3 27.3 19.5 7.7 8.2 13.7 17.8 18.1 28.8 4.4 11 6.7 22.7 6.7 35.1s-2.2 24-6.7 34.8c-4.4 10.8-10.5 20.2-18.1 28.3-7.7 8.1-16.8 14.5-27.3 19.1s-21.9 7-34.1 7c-12.2 0-23.5-2.3-34-7s-19.5-11-27.3-19.1c-7.8-8.1-13.9-17.5-18.3-28.3s-6.7-22.4-6.7-34.8 2.2-24.1 6.7-35.1c4.4-11 10.5-20.6 18.3-28.8 7.8-8.2 16.9-14.7 27.3-19.5s21.8-7.2 34-7.2 23.6 2.4 34.1 7.2zm-11.6 141.7c7-3.3 13.2-7.8 18.5-13.5 5.3-5.7 9.5-12.4 12.5-20.1 3-7.8 4.5-16 4.5-24.6 0-8.9-1.5-17.3-4.5-25.1-3-7.9-7.2-14.7-12.5-20.5-5.3-5.8-11.5-10.4-18.5-13.8s-14.5-5.2-22.5-5.2-15.5 1.7-22.5 5.2-13.1 8-18.3 13.8-9.3 12.6-12.3 20.5-4.5 16.3-4.5 25.1c0 8.7 1.5 16.9 4.5 24.6 3 7.8 7.1 14.5 12.3 20.1 5.2 5.7 11.3 10.2 18.3 13.5 7 3.3 14.5 5 22.5 5s15.5-1.7 22.5-5zM70.9 326c-4.6 0-9.2-1.1-13.4-3.4-9.2-4.9-15-14.5-15-25V184.3c0-15.7 12.7-28.3 28.3-28.3s28.3 12.7 28.3 28.3v60.4l90.6-60.4L55.1 94.5c-13-8.7-16.5-26.3-7.9-39.3 8.7-13 26.3-16.5 39.3-7.9l170.1 113.4c7.9 5.3 12.6 14.1 12.6 23.6s-4.7 18.3-12.6 23.6l-170 113.3c-4.8 3.2-10.2 4.8-15.7 4.8z"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 742 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 1018 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="225.038" height="298.103"><defs><clipPath id="a"><path d="M0 1080h1920V0H0v1080z"/></clipPath></defs><g clip-path="url(#a)" transform="matrix(1.25 0 0 -1.25 -1083.117 819.262)"><path d="M946.697 450.868c-19.84 0-38.464 5.1-54.63 14.008l-16.964-29.537c21.176-11.707 45.584-18.412 71.594-18.412 26.01 0 50.418 6.705 71.594 18.412l-16.962 29.537c-16.167-8.909-34.79-14.008-54.632-14.008" fill="#0ba0be"/><path d="M946.433 528.849c-25.605 0-45.278 20.922-45.278 46.527 0 25.606 19.673 46.528 45.278 46.528 25.918 0 44.966-20.922 44.966-46.528 0-25.605-19.048-46.527-44.966-46.527m100.09 90.56v36c-15 0-21.906-.92-25.98-2.784-4.071-1.864-3.494-1.775-7.278-4.571-3.456-2.555-9.3-8.65-13.073-12.84-14.08 12.589-32.834 20.1-53.76 20.1-45.277 0-79.938-34.66-79.938-79.938 0-44.965 34.66-80.251 79.939-80.251 44.966 0 79.939 35.286 79.939 80.25 0 16.47-4.644 31.52-12.695 44.023.022.002.062.012.076.012h32.77z"/></g></svg>

After

Width:  |  Height:  |  Size: 959 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="132.004" height="132" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient id="b"><stop offset="0" stop-color="#3771c8"/><stop stop-color="#3771c8" offset=".128"/><stop offset="1" stop-color="#60f" stop-opacity="0"/></linearGradient><linearGradient id="a"><stop offset="0" stop-color="#fd5"/><stop offset=".1" stop-color="#fd5"/><stop offset=".5" stop-color="#ff543e"/><stop offset="1" stop-color="#c837ab"/></linearGradient><radialGradient id="c" cx="158.429" cy="578.088" r="65" xlink:href="#a" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.98198 1.8439 0 -1031.402 454.004)" fx="158.429" fy="578.088"/><radialGradient id="d" cx="147.694" cy="473.455" r="65" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.17394 .86872 -3.5818 .71718 1648.348 -458.493)" fx="147.694" fy="473.455"/></defs><path fill="url(#c)" d="M65.03 0C37.888 0 29.95.028 28.407.156c-5.57.463-9.036 1.34-12.812 3.22-2.91 1.445-5.205 3.12-7.47 5.468C4 13.126 1.5 18.394.595 24.656c-.44 3.04-.568 3.66-.594 19.188-.01 5.176 0 11.988 0 21.125 0 27.12.03 35.05.16 36.59.45 5.42 1.3 8.83 3.1 12.56 3.44 7.14 10.01 12.5 17.75 14.5 2.68.69 5.64 1.07 9.44 1.25 1.61.07 18.02.12 34.44.12 16.42 0 32.84-.02 34.41-.1 4.4-.207 6.955-.55 9.78-1.28a27.22 27.22 0 0 0 17.75-14.53c1.765-3.64 2.66-7.18 3.065-12.317.088-1.12.125-18.977.125-36.81 0-17.836-.04-35.66-.128-36.78-.41-5.22-1.305-8.73-3.127-12.44-1.495-3.037-3.155-5.305-5.565-7.624C116.9 4 111.64 1.5 105.372.596 102.335.157 101.73.027 86.19 0H65.03z" transform="translate(1.004 1)"/><path fill="url(#d)" d="M65.03 0C37.888 0 29.95.028 28.407.156c-5.57.463-9.036 1.34-12.812 3.22-2.91 1.445-5.205 3.12-7.47 5.468C4 13.126 1.5 18.394.595 24.656c-.44 3.04-.568 3.66-.594 19.188-.01 5.176 0 11.988 0 21.125 0 27.12.03 35.05.16 36.59.45 5.42 1.3 8.83 3.1 12.56 3.44 7.14 10.01 12.5 17.75 14.5 2.68.69 5.64 1.07 9.44 1.25 1.61.07 18.02.12 34.44.12 16.42 0 32.84-.02 34.41-.1 4.4-.207 6.955-.55 9.78-1.28a27.22 27.22 0 0 0 17.75-14.53c1.765-3.64 2.66-7.18 3.065-12.317.088-1.12.125-18.977.125-36.81 0-17.836-.04-35.66-.128-36.78-.41-5.22-1.305-8.73-3.127-12.44-1.495-3.037-3.155-5.305-5.565-7.624C116.9 4 111.64 1.5 105.372.596 102.335.157 101.73.027 86.19 0H65.03z" transform="translate(1.004 1)"/><path fill="#fff" d="M66.004 18c-13.036 0-14.672.057-19.792.29-5.11.234-8.598 1.043-11.65 2.23-3.157 1.226-5.835 2.866-8.503 5.535-2.67 2.668-4.31 5.346-5.54 8.502-1.19 3.053-2 6.542-2.23 11.65C18.06 51.327 18 52.964 18 66s.058 14.667.29 19.787c.235 5.11 1.044 8.598 2.23 11.65 1.227 3.157 2.867 5.835 5.536 8.503 2.667 2.67 5.345 4.314 8.5 5.54 3.054 1.187 6.543 1.996 11.652 2.23 5.12.233 6.755.29 19.79.29 13.037 0 14.668-.057 19.788-.29 5.11-.234 8.602-1.043 11.656-2.23 3.156-1.226 5.83-2.87 8.497-5.54 2.67-2.668 4.31-5.346 5.54-8.502 1.18-3.053 1.99-6.542 2.23-11.65.23-5.12.29-6.752.29-19.788 0-13.036-.06-14.672-.29-19.792-.24-5.11-1.05-8.598-2.23-11.65-1.23-3.157-2.87-5.835-5.54-8.503-2.67-2.67-5.34-4.31-8.5-5.535-3.06-1.187-6.55-1.996-11.66-2.23-5.12-.233-6.75-.29-19.79-.29zm-4.306 8.65c1.278-.002 2.704 0 4.306 0 12.816 0 14.335.046 19.396.276 4.68.214 7.22.996 8.912 1.653 2.24.87 3.837 1.91 5.516 3.59 1.68 1.68 2.72 3.28 3.592 5.52.657 1.69 1.44 4.23 1.653 8.91.23 5.06.28 6.58.28 19.39s-.05 14.33-.28 19.39c-.214 4.68-.996 7.22-1.653 8.91-.87 2.24-1.912 3.835-3.592 5.514-1.68 1.68-3.275 2.72-5.516 3.59-1.69.66-4.232 1.44-8.912 1.654-5.06.23-6.58.28-19.396.28-12.817 0-14.336-.05-19.396-.28-4.68-.216-7.22-.998-8.913-1.655-2.24-.87-3.84-1.91-5.52-3.59-1.68-1.68-2.72-3.276-3.592-5.517-.657-1.69-1.44-4.23-1.653-8.91-.23-5.06-.276-6.58-.276-19.398s.046-14.33.276-19.39c.214-4.68.996-7.22 1.653-8.912.87-2.24 1.912-3.84 3.592-5.52 1.68-1.68 3.28-2.72 5.52-3.592 1.692-.66 4.233-1.44 8.913-1.655 4.428-.2 6.144-.26 15.09-.27zm29.928 7.97a5.76 5.76 0 1 0 5.76 5.758c0-3.18-2.58-5.76-5.76-5.76zm-25.622 6.73c-13.613 0-24.65 11.037-24.65 24.65 0 13.613 11.037 24.645 24.65 24.645C79.617 90.645 90.65 79.613 90.65 66S79.616 41.35 66.003 41.35zm0 8.65c8.836 0 16 7.163 16 16 0 8.836-7.164 16-16 16-8.837 0-16-7.164-16-16 0-8.837 7.163-16 16-16z"/></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 73.275 75.76" id="svg2"><defs id="defs4"><style id="style6"/><linearGradient id="linear-gradient" x1="34.64" y1="15.35" x2="19" y2="30.99" gradientUnits="userSpaceOnUse"><stop offset=".18" stop-color="#0052cc" id="stop9"/><stop offset="1" stop-color="#2684ff" id="stop11"/></linearGradient><linearGradient id="linear-gradient-2" x1="38.78" y1="60.28" x2="54.39" y2="44.67" xlink:href="#linear-gradient"/><linearGradient xlink:href="#linear-gradient" id="linearGradient3027" gradientUnits="userSpaceOnUse" x1="34.64" y1="15.35" x2="19" y2="30.99"/><linearGradient xlink:href="#linear-gradient" id="linearGradient3045" gradientUnits="userSpaceOnUse" x1="34.64" y1="15.35" x2="19" y2="30.99"/><linearGradient xlink:href="#linear-gradient" id="linearGradient3047" x1="38.78" y1="60.28" x2="54.39" y2="44.67"/><linearGradient xlink:href="#linear-gradient" id="linearGradient3050" x1="38.78" y1="60.28" x2="54.39" y2="44.67" gradientTransform="translate(-.003)"/><linearGradient xlink:href="#linear-gradient" id="linearGradient3053" gradientUnits="userSpaceOnUse" x1="34.64" y1="15.35" x2="19" y2="30.99" gradientTransform="translate(-.003)"/></defs><path d="M72.397 35.76l-32.6-32.6L36.637 0l-24.54 24.54L.877 35.76a3 3 0 0 0 0 4.24l22.42 22.42 13.34 13.34 24.54-24.54.38-.38L72.397 40a3 3 0 0 0 0-4.24zm-35.76 13.32l-11.2-11.2 11.2-11.2 11.2 11.2z" id="path42" fill="#2684ff"/><path d="M36.637 26.68a18.86 18.86 0 0 1-.08-26.59l-24.51 24.5 13.34 13.34 11.25-11.25z" id="path44" fill="url(#linearGradient3053)"/><path d="M47.867 37.85l-11.23 11.23a18.86 18.86 0 0 1 0 26.68l24.57-24.57z" id="path46" fill="url(#linearGradient3050)"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-0.99 262.096 91.39 108.05" width="87.39" height="104.05"><defs><path d="M43.7 263.1c-14.34 0-25.96 11.62-25.96 25.96 0 14.34 11.62 25.96 25.96 25.96 14.34 0 25.97-11.62 25.97-25.96 0-14.34-11.63-25.96-25.97-25.96z" id="a"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="43.7" y1="271.73" x2="43.7" y2="325.04"><stop offset="0%" stop-color="#2684ff"/><stop offset="82%" stop-color="#0052cc"/></linearGradient><path d="M.38 323.54a2.908 2.908 0 0 1 1.13-3.96c.04-.03.09-.05.13-.07 1.97-.97 17.7-8.69 19.67-9.65 1.37-.67 3.03-.17 3.79 1.16a97.199 97.199 0 0 0 42.21 38.2 125.638 125.638 0 0 1-21.39 17.29c-1.36.85-3.07.85-4.43 0A125.16 125.16 0 0 1 .38 323.54z" id="c"/><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="27.72" y1="323.54" x2="45.58" y2="360.91"><stop offset="0%" stop-color="#2684ff"/><stop offset="62%" stop-color="#0052cc"/></linearGradient><path d="M87.03 323.54c.78-1.41.28-3.18-1.12-3.96-.04-.03-.09-.05-.13-.07-1.97-.97-17.71-8.69-19.68-9.65a2.912 2.912 0 0 0-3.8 1.16 97.12 97.12 0 0 1-42.2 38.2 125.25 125.25 0 0 0 21.39 17.29c1.36.85 3.07.85 4.43 0a125.16 125.16 0 0 0 41.11-42.97z" id="e"/></defs><use xlink:href="#a" fill="url(#b)"/><use xlink:href="#a" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#c" fill="url(#d)"/><use xlink:href="#c" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#e" fill="#2684ff"/><use xlink:href="#e" fill-opacity="0" stroke="#000" stroke-opacity="0"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80"><path fill="#303847" d="M0 0h80v80H0z"/><path fill="#FFF" d="M41.7 38.6l-3.5-.6 1.6-7.4-6.2 9.3 3.6.6-1.7 7.8z"/><path d="M52.2 59.8c-.3-3.4-.5-6.8-.6-10.2-.9.1-1.7.2-2.6.2-2.9 3-6.9 4.8-11.1 4.8-5.7 0-10.9-3.2-13.5-8.2-.3-.1-.7-.2-1-.4l.5 1.1-2-.3c-.6-.1-1.2-.1-1.8-.2 1.5 3 4 5.7 7.1 7.8 1.9 2.1 3.1 4.9 3.1 8 0 1.9-.5 3.8-1.3 5.4-.2.3-.1 1 .4 1.2 1.5.6 3.1 1 4.7 1 .8 0 1.5-.1 2.2-.2-.2-.8-.3-1.6-.3-2.4 0-3.1 1.2-5.9 3.1-8 1.6.3 4.3.6 3.9.6 0 1.7.4 3.3 1.1 4.7l1-1c-.3-1-.5-2-.5-3v-.5h-.1 1.9c2.1 0 4-.2 5.8-.4zM37.9 24.2c4.2 0 8.2 1.7 11.1 4.8.9 0 1.7.1 2.6.2.1-3.4.3-6.7.6-10.1V19c-1.8-.3-3.6-.4-5.5-.4-13.5 0-24.7 6.8-27.7 15.9 1.8-.8 3.6-1.5 5.4-2.2 2.6-4.9 7.8-8.1 13.5-8.1z" fill="#FFF"/><circle fill="#FFF" cx="71" cy="39.6" r="4"/><path fill="#FFF" d="M32.4 18.4c1.4 0 2.9.1 4.3.3 1.2-.3 2.4-.6 3.6-.8-4.1-1.5-8.6-2.3-13.2-2.3-4 0-7.8.6-11.4 1.7l1.8 4.7c4.4-2.3 9.5-3.6 14.9-3.6zm20.2 21c0 6.8.3 13.5.8 20.2 1.2-.2 2.4-.5 3.5-.8.5-6.4.7-12.9.7-19.4 0-6.5-.2-13-.7-19.4-1.1-.3-2.3-.6-3.5-.8-.6 6.7-.8 13.4-.8 20.2z"/><path fill="#FFF" d="M33.7 19.6h-1.3c-6.2 0-12.2 1.8-17.3 5.1l4.8 5.3c2.8-4.5 7.8-8.2 13.8-10.4zm32.5 21.6c-.2-.5-.3-1.1-.3-1.7 0-.6.1-1.2.3-1.7-2.8 0-5.3-.9-7.5-2.3v8c2.1-1.4 4.7-2.3 7.5-2.3zm-14.8-1.8c0-3 .1-6 .2-9.1-1-.1-2.1-.2-3.1-.2-2.6-2.9-6.3-4.8-10.5-4.8-5.6 0-10.4 3.3-12.7 8-4.5 1.5-8.8 3.6-12.8 6.1 1.7 1.1 3.5 2.1 5.3 3-4.6 1.1-8.9 2.9-12.7 5.4 3.8-1.5 8-2.4 12.3-2.4 1.6 0 3.1.1 4.7.3-.5-1.2-.8-2.5-1-3.8.3.8.6 1.6 1 2.4 1.1.4 2.1.8 3.2 1.2 2.3 4.7 7.1 8 12.7 8 4.2 0 8-1.8 10.5-4.8 1-.1 2.1-.1 3.1-.2-.2-3.1-.2-6.1-.2-9.1zM37.9 51.3C31.3 51.3 26 46 26 39.4c0-6.6 5.3-11.9 11.9-11.9s11.9 5.3 11.9 11.9c0 6.6-5.3 11.9-11.9 11.9z"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-1.001 277.155 94.595 70.721" width="90.6" height="66.72"><defs><path d="M45.3 302.46c-11.72 0-21.21 9.49-21.21 21.21 0 11.71 9.49 21.21 21.21 21.21 11.71 0 21.21-9.5 21.21-21.21 0-11.72-9.5-21.21-21.21-21.21z" id="a"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="45.3" y1="337.58" x2="45.3" y2="300"><stop offset="0%" stop-color="#2684ff"/><stop offset="82%" stop-color="#0052cc"/></linearGradient><path d="M11.96 312.62c.87 1.02 2.4 1.14 3.42.28l.03-.03c18.44-16.53 41.27-16.53 59.76 0 1.01.89 2.55.78 3.43-.23.01 0 .01-.01.02-.02l11.4-13.49c.86-1.02.74-2.54-.28-3.41-26.77-23.42-62.13-23.42-88.89 0a2.423 2.423 0 0 0-.28 3.41l11.39 13.49z" id="c"/></defs><use xlink:href="#a" fill="url(#b)"/><use xlink:href="#a" fill-opacity="0" stroke="#000" stroke-opacity="0"/><use xlink:href="#c" fill="#2684ff"/><use xlink:href="#c" fill-opacity="0" stroke="#000" stroke-opacity="0"/></svg>

After

Width:  |  Height:  |  Size: 987 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 102 101.99"><defs><linearGradient id="a" x1="51" y1="101.99" x2="51" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0b7abf"/><stop offset="1" stop-color="#368dcc"/></linearGradient></defs><g data-name="Layer 2"><path d="M89.25 0h-76.5A12.75 12.75 0 0 0 0 12.75v76.5A12.75 12.75 0 0 0 12.75 102h76.5A12.75 12.75 0 0 0 102 89.25v-76.5A12.75 12.75 0 0 0 89.25 0zM44.37 77.26a6.12 6.12 0 0 1-6.12 6.12H19.38a6.12 6.12 0 0 1-6.12-6.12V19.38a6.12 6.12 0 0 1 6.12-6.12h18.87a6.12 6.12 0 0 1 6.12 6.12zm44.37-25.5a6.12 6.12 0 0 1-6.12 6.12H63.75a6.12 6.12 0 0 1-6.12-6.12V19.38a6.12 6.12 0 0 1 6.12-6.12h18.87a6.12 6.12 0 0 1 6.12 6.12z" fill="url(#a)" data-name="Layer 1"/></g></svg>

After

Width:  |  Height:  |  Size: 743 B

View File

Before

Width:  |  Height:  |  Size: 968 B

After

Width:  |  Height:  |  Size: 968 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -177,24 +177,6 @@ exports.short_huddle_name = function (huddle) {
return names.join(', ');
};
exports.huddle_fraction_present = function (huddle) {
var user_ids = huddle.split(',');
var num_present = 0;
_.each(user_ids, function (user_id) {
if (presence.is_active(user_id)) {
num_present += 1;
}
});
if (num_present === user_ids.length) {
return 1;
} else if (num_present !== 0) {
return 0.5;
}
return false;
};
function focus_lost() {
// When we become idle, we don't immediately send anything to the
// server; instead, we wait for our next periodic update, since
@@ -280,7 +262,7 @@ exports.update_huddles = function () {
user_ids_string: huddle,
name: exports.full_huddle_name(huddle),
href: hash_util.huddle_with_uri(huddle),
fraction_present: exports.huddle_fraction_present(huddle),
fraction_present: buddy_data.huddle_fraction_present(huddle),
short_name: exports.short_huddle_name(huddle),
};
});
@@ -393,22 +375,26 @@ exports.update_presence_info = function (email, info, server_time) {
presence.set_info_for_user(user_id, info, server_time);
exports.redraw_user(user_id);
exports.update_huddles();
pm_list.update_private_messages();
};
exports.on_set_away = function (user_id) {
user_status.set_away(user_id);
exports.redraw_user(user_id);
pm_list.update_private_messages();
};
exports.on_revoke_away = function (user_id) {
user_status.revoke_away(user_id);
exports.redraw_user(user_id);
pm_list.update_private_messages();
};
exports.redraw = function () {
exports.build_user_sidebar();
exports.user_cursor.redraw();
exports.update_huddles();
pm_list.update_private_messages();
};
exports.reset_users = function () {

Some files were not shown because too many files have changed in this diff Show More