mirror of https://github.com/zulip/zulip.git
docs: Fix many spelling mistakes.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
parent
d8f4e0ffb9
commit
b0ce4f1bce
|
@ -41,7 +41,7 @@ jobs:
|
|||
container: ${{ matrix.docker_image }}
|
||||
env:
|
||||
# GitHub Actions sets HOME to /github/home which causes
|
||||
# problem later in provison and frontend test that runs
|
||||
# problem later in provision and frontend test that runs
|
||||
# tools/setup/postgresql-init-dev-db because of the .pgpass
|
||||
# location. PostgreSQL (psql) expects .pgpass to be at
|
||||
# /home/github/.pgpass and setting home to `/home/github/`
|
||||
|
@ -195,7 +195,7 @@ jobs:
|
|||
- name: Upload coverage reports
|
||||
|
||||
# Only upload coverage when both frontend and backend
|
||||
# tests are ran.
|
||||
# tests are run.
|
||||
if: ${{ matrix.include_frontend_tests }}
|
||||
uses: codecov/codecov-action@v2
|
||||
with:
|
||||
|
|
|
@ -576,7 +576,7 @@ def compute_plan_parameters(
|
|||
) -> Tuple[datetime, datetime, datetime, int]:
|
||||
# Everything in Stripe is stored as timestamps with 1 second resolution,
|
||||
# so standardize on 1 second resolution.
|
||||
# TODO talk about leapseconds?
|
||||
# TODO talk about leap seconds?
|
||||
billing_cycle_anchor = timezone_now().replace(microsecond=0)
|
||||
if billing_schedule == CustomerPlan.ANNUAL:
|
||||
period_end = add_months(billing_cycle_anchor, 12)
|
||||
|
|
|
@ -49,7 +49,7 @@ def payment_method_string(stripe_customer: stripe.Customer) -> str:
|
|||
brand=default_payment_method.card.brand,
|
||||
last4=default_payment_method.card.last4,
|
||||
)
|
||||
# There might be oneoff stuff we do for a particular customer that
|
||||
# There might be one-off stuff we do for a particular customer that
|
||||
# would land them here. E.g. by default we don't support ACH for
|
||||
# automatic payments, but in theory we could add it for a customer via
|
||||
# the Stripe dashboard.
|
||||
|
|
|
@ -80,7 +80,7 @@ def stripe_webhook(request: HttpRequest) -> HttpResponse:
|
|||
)
|
||||
except PaymentIntent.DoesNotExist:
|
||||
# PaymentIntent that was not manually created from the billing system.
|
||||
# Could be an Invoice getting paid which is is not an event we are interested in.
|
||||
# Could be an Invoice getting paid which is not an event we are interested in.
|
||||
return HttpResponse(status=200)
|
||||
event.content_type = ContentType.objects.get_for_model(PaymentIntent)
|
||||
event.object_id = payment_intent.id
|
||||
|
@ -95,7 +95,7 @@ def stripe_webhook(request: HttpRequest) -> HttpResponse:
|
|||
)
|
||||
except PaymentIntent.DoesNotExist:
|
||||
# PaymentIntent that was not manually created from the billing system.
|
||||
# Could be an Invoice getting paid which is is not an event we are interested in.
|
||||
# Could be an Invoice getting paid which is not an event we are interested in.
|
||||
return HttpResponse(status=200)
|
||||
event.content_type = ContentType.objects.get_for_model(PaymentIntent)
|
||||
event.object_id = payment_intent.id
|
||||
|
|
|
@ -94,7 +94,7 @@ License: Expat
|
|||
Files: static/assets/icons/ellipsis-v-solid.svg
|
||||
Copyright: 2017 Fonticons, Inc.
|
||||
License: CC-BY-4.0
|
||||
Comment: This icon is picked from Version 5.13.0 of Fontawesome
|
||||
Comment: This icon is picked from Version 5.13.0 of Font Awesome
|
||||
|
||||
Files: zerver/lib/markdown/fenced_code.py
|
||||
Copyright: 2006-2008 Waylan Limberg
|
||||
|
|
|
@ -66,7 +66,7 @@ model GitHub supports).
|
|||
message-editing** and **area: message view** labels are both related
|
||||
to the
|
||||
[Server message view](https://github.com/orgs/zulip/teams/server-message-view)
|
||||
team. Feel free to join as many area label teams as as you'd like!
|
||||
team. Feel free to join as many area label teams as you'd like!
|
||||
|
||||
After your request to join an area label team is approved, you'll receive
|
||||
notifications for any issues labeled with the team's corresponding area
|
||||
|
|
|
@ -63,7 +63,7 @@ the current documentation as a resource and guide as you begin.
|
|||
|
||||
- Read through the existing articles in that section and pay attention
|
||||
to the writing style and [voice](#voice), as well as any
|
||||
[Markdown features](#markdown-features) used to enchance the
|
||||
[Markdown features](#markdown-features) used to enhance the
|
||||
readability of the documentation.
|
||||
|
||||
- Should the feature you're documenting be added or merged into an
|
||||
|
|
|
@ -41,7 +41,7 @@ current state of the index and advancing HEAD to point at the new
|
|||
A fast-forward is a special type of merge where you have a revision
|
||||
and you are "merging" another branch's changes that happen to be a
|
||||
descendant of what you have. In such these cases, you do not make a
|
||||
new mergecommit but instead just update to their revision. This will
|
||||
new merge commit but instead just update to their revision. This will
|
||||
happen frequently on a remote-tracking branch of a remote
|
||||
repository.
|
||||
|
||||
|
|
|
@ -256,7 +256,7 @@ Zulip, you need to update your local Git database with new refs from your
|
|||
GitHub fork. You do this with `git fetch`:
|
||||
|
||||
```console
|
||||
$ git fetch <usermame>
|
||||
$ git fetch <username>
|
||||
```
|
||||
|
||||
Ideally you should do this before you have made any commits on the same branch
|
||||
|
|
|
@ -305,7 +305,7 @@ log][commit-log] for an up-to-date list of raw changes.
|
|||
- Improved formatting for Grafana integration.
|
||||
- Fixed previews of Dropbox image links.
|
||||
- Fixed support for storing avatars/emoji in non-S3 upload backends.
|
||||
- Fixed an overly strict database constaint for code playgrounds.
|
||||
- Fixed an overly strict database constraint for code playgrounds.
|
||||
- Tagged user status strings for translation.
|
||||
- Updated translation data from Transifex.
|
||||
|
||||
|
@ -405,7 +405,7 @@ log][commit-log] for an up-to-date list of raw changes.
|
|||
- Added new [release lifecycle documentation](../overview/release-lifecycle.md).
|
||||
- Added support for subscribing another stream's membership to a stream.
|
||||
- Added RealmAuditLog for most settings state changes in Zulip; this
|
||||
data will fascilitate future features showing a log of activity by
|
||||
data will facilitate future features showing a log of activity by
|
||||
a given user or changes to an organization's settings.
|
||||
- Added support for using Sentry for processing backend exceptions.
|
||||
- Added documentation for using `wal-g` for continuous PostgreSQL backups.
|
||||
|
@ -492,7 +492,7 @@ log][commit-log] for an up-to-date list of raw changes.
|
|||
`can_create_user` and `can_forge_sender` (used for mirroring).
|
||||
- Various API endpoints creating objects now return the ID of the
|
||||
created object.
|
||||
- Fixed screenreader accessibility of many components, including
|
||||
- Fixed screen reader accessibility of many components, including
|
||||
the compose box, message editing, popovers, and many more.
|
||||
- Fixed transparency issues uploading some animated GIFs as custom emoji.
|
||||
- Improved positioning logic for inline YouTube previews.
|
||||
|
@ -822,7 +822,7 @@ log][commit-log] for an up-to-date list of raw changes.
|
|||
mobile apps.
|
||||
- Removed the legacy websockets-based system for sending messages. This
|
||||
system was always a hack, was only ever used for one endpoint, and
|
||||
did not provide a measureable latency benefit over HTTP/2.
|
||||
did not provide a measurable latency benefit over HTTP/2.
|
||||
|
||||
## Zulip 2.1.x series
|
||||
|
||||
|
@ -1131,7 +1131,7 @@ details.
|
|||
- Fixed buggy rendering of bulleted lists inside blockquotes.
|
||||
- Fixed several bugs with CORS in the nginx configuration.
|
||||
- Fixed error message for GitHub login attempts with a deactivated account.
|
||||
- Fixed email gateway issues with non-latin characters in stream names.
|
||||
- Fixed email gateway issues with non-Latin characters in stream names.
|
||||
- Fixed endless re-synchronization of LDAP user avatars (which
|
||||
could cause user-visible performance issues for desktop/web clients).
|
||||
- Fixed all known bugs with advanced LDAP data synchronization.
|
||||
|
@ -1844,7 +1844,7 @@ running a version from before 1.7 should upgrade directly to 1.7.1.
|
|||
#### Full feature changelog
|
||||
|
||||
- Simplified the process for installing a new Zulip server, as well as
|
||||
fixing the most common roadbumps and confusing error messages.
|
||||
fixing the most common road bumps and confusing error messages.
|
||||
- Added a new "incoming webhook" bot type, limited to only sending
|
||||
messages into Zulip, for better security.
|
||||
- Added experimental support for outgoing webhooks.
|
||||
|
@ -1928,7 +1928,7 @@ running a version from before 1.7 should upgrade directly to 1.7.1.
|
|||
- Fixed zombie process leaks on servers with <4GB of RAM.
|
||||
- Fixed Markdown previews of /me messages.
|
||||
- Fixed a subtle bug involving timestamps of locally echoed messages.
|
||||
- Fixed the behavior of key combintions like Ctrl+Enter in the compose box.
|
||||
- Fixed the behavior of key combinations like Ctrl+Enter in the compose box.
|
||||
- Worked around Google Compute Engine's default boto configuration,
|
||||
which broke Zulip (and any other app using boto).
|
||||
- Zulip now will gracefully handle the PostgreSQL server being restarted.
|
||||
|
@ -2403,7 +2403,7 @@ running a version from before 1.7 should upgrade directly to 1.7.1.
|
|||
/etc/zulip/secrets.conf.
|
||||
- Improved the styling for the Administration page and added tabs.
|
||||
- Substantially improved loading performance on slow networks by enabling
|
||||
GZIP compression on more assets.
|
||||
gzip compression on more assets.
|
||||
- Changed the page title in narrowed views to include the current narrow.
|
||||
- Fixed several backend performance issues affecting very large realms.
|
||||
- Fixed bugs where draft compose content might be lost when reloading site.
|
||||
|
|
|
@ -284,7 +284,7 @@ variable reverse proxy implementations.
|
|||
|
||||
If your Zulip server will not be on the public Internet, we recommend,
|
||||
installing with the `--self-signed-cert` option (rather than the
|
||||
`--certbot` option), since CertBot requires the server to be on the
|
||||
`--certbot` option), since Certbot requires the server to be on the
|
||||
public Internet.
|
||||
|
||||
#### Configuring Zulip to allow HTTP
|
||||
|
|
|
@ -293,7 +293,7 @@ archive of all the organization's uploaded files.
|
|||
version of Zulip as the server you're exporting from.
|
||||
|
||||
- For exports from Zulip Cloud (zulip.com), you need to [upgrade to
|
||||
`main`][upgrade-zulip-from-git], since we run run `main` on
|
||||
`main`][upgrade-zulip-from-git], since we run `main` on
|
||||
Zulip Cloud:
|
||||
|
||||
```bash
|
||||
|
|
|
@ -132,7 +132,7 @@ There are dozens of useful management commands under
|
|||
For most purposes, deactivating users is preferred, since that does not
|
||||
alter message history for other users.
|
||||
See the `./manage.py delete_user --help` documentation for details.
|
||||
- `./manage.py clear_auth_rate_limit_history`: If a user failed authenticaton
|
||||
- `./manage.py clear_auth_rate_limit_history`: If a user failed authentication
|
||||
attempts too many times and further attempts are disallowed by the rate limiter,
|
||||
this can be used to reset the limit.
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ and privacy in mind:
|
|||
registered to be notified by your Zulip server.
|
||||
- User ID numbers generated by your Zulip server, needed to route
|
||||
a given notification to the appropriate set of mobile devices.
|
||||
These user ID numbers are are opaque to the Push Notification
|
||||
These user ID numbers are opaque to the Push Notification
|
||||
Service and Kandra Labs.
|
||||
- The Push Notification Service receives (but does not store) the
|
||||
contents of individual mobile push notifications:
|
||||
|
|
|
@ -158,7 +158,7 @@ regularly install apt upgrades manually!
|
|||
:::
|
||||
|
||||
Restarting one of the system services that Zulip uses (PostgreSQL,
|
||||
memcached, Redis, or Rabbitmq) will drop the connections that
|
||||
memcached, Redis, or RabbitMQ) will drop the connections that
|
||||
Zulip processes have to the service, resulting in future operations on
|
||||
those connections throwing errors.
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ doesn't need to worry about whether the data returned is up-to-date:
|
|||
it is. In the following sections, we'll talk about how we make this
|
||||
work.
|
||||
|
||||
As a sidenote, the policy of using these accessor functions wherever
|
||||
As a side note, the policy of using these accessor functions wherever
|
||||
possible is a good idea, regardless of caching, because the functions
|
||||
also generally take care of details you might not think about
|
||||
(e.g. case-insensitive matching of stream names or email addresses).
|
||||
|
|
|
@ -44,7 +44,7 @@ which is used to help ensure developers don't spend time debugging
|
|||
test/linter/etc. failures that actually were caused by the developer
|
||||
rebasing and forgetting to provision". `PROVISION_VERSION` has a
|
||||
format of `x.y`; when `x` doesn't match the value from the last time
|
||||
the user provisioned, or `y` is higher than than the value from last
|
||||
the user provisioned, or `y` is higher than the value from last
|
||||
time, most Zulip tools will crash early and ask the user to provision.
|
||||
This has empirically made a huge impact on how often developers spend
|
||||
time debugging a "weird failure" after rebasing that had an easy
|
||||
|
|
|
@ -164,7 +164,7 @@ for that:
|
|||
|
||||
- If there are natural things someone might type, like `:happy:`, we try to
|
||||
find an emoji to match. This extends to things that someone might not
|
||||
think to type, but as soon as someone in the organization discovers it it
|
||||
think to type, but as soon as someone in the organization discovers it
|
||||
could get wide use, like `:working_on_it:`. Good future work would be to
|
||||
collect (by survey or tooling) things people type into the emoji picker
|
||||
typeahead on chat.zulip.org, and find ways to add those names as
|
||||
|
|
|
@ -304,7 +304,7 @@ There are some notable optional parameters for `verify_action`:
|
|||
doesn't actually require state changes for some reason; otherwise,
|
||||
`verify_action` will complain that your test doesn't really
|
||||
exercise any `apply_events` logic. Typing notifications (which
|
||||
are ephemereal) are a common place where we use this.
|
||||
are ephemeral) are a common place where we use this.
|
||||
|
||||
- `num_events` will tell `verify_action` how many events the
|
||||
`hamlet` user will receive after the action (the default is 1).
|
||||
|
|
|
@ -5,7 +5,7 @@ formatting. Our Markdown flavor is unique primarily to add important
|
|||
extensions, such as quote blocks and math blocks, and also to do
|
||||
previews and correct issues specific to the chat context. Beyond
|
||||
that, it has a number of minor historical variations resulting from
|
||||
its history predacting CommonMark (and thus Zulip choosing different
|
||||
its history predating CommonMark (and thus Zulip choosing different
|
||||
solutions to some problems) and based in part on Python-Markdown,
|
||||
which is proudly a classic Markdown implementation. We reduce these
|
||||
variations with every major Zulip release.
|
||||
|
|
|
@ -45,7 +45,7 @@ will instead select the first unread message matching that narrow, or
|
|||
if there are none, the most recent messages matching that narrow.
|
||||
|
||||
This provides the nice user experience of taking you to the start of
|
||||
the new stuff (with enough messages you'ev seen before still in view
|
||||
the new stuff (with enough messages you've seen before still in view
|
||||
at the top to provide you with context), which is usually what you
|
||||
want. (When finding the "first unread message", Zulip ignores unread
|
||||
messages in muted streams or in muted topics within non-muted
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
# Realms in Zulip
|
||||
|
||||
Zulip allows multiple _realms_ to be hosted on a single instance.
|
||||
Realms are the Zulip codebases's internal name for what we refer to in
|
||||
Realms are the Zulip codebase's internal name for what we refer to in
|
||||
user-facing documentation as an organization (the name "realm" comes
|
||||
from [Kerberos](https://web.mit.edu/kerberos/)).
|
||||
|
||||
Wherever possible, we avoid using the term `realm` in any user-facing
|
||||
string or documentation; "Organization" is the equivalent term used in
|
||||
those contexts (and we have linters that attempt to enforce this rule
|
||||
in translateable strings). We may in the future modify Zulip's
|
||||
in translatable strings). We may in the future modify Zulip's
|
||||
internals to use `organization` instead.
|
||||
|
||||
The
|
||||
|
|
|
@ -129,7 +129,7 @@ migrations.
|
|||
the migration can even continue where it left off, without needing
|
||||
to redo work.
|
||||
- **Multi-step migrations**. For really big migrations, one wants
|
||||
to split the transition into into several commits that are each
|
||||
to split the transition into several commits that are each
|
||||
individually correct, and can each be deployed independently:
|
||||
|
||||
1. First, do a migration to add the new column to the Message table
|
||||
|
|
|
@ -67,7 +67,7 @@ how long they pause to think, and how frequently they get interrupted.
|
|||
|
||||
## Server
|
||||
|
||||
The server piece of typing notificiations is currently pretty
|
||||
The server piece of typing notifications is currently pretty
|
||||
straightforward, since we take advantage of Zulip's
|
||||
[events system](../subsystems/events-system.md).
|
||||
|
||||
|
|
|
@ -83,9 +83,9 @@ the images we use in GitHub Actions for testing.
|
|||
|
||||
After booting the container from the configured image, GitHub Actions will
|
||||
create the directory mentioned in `working_directory` and all the
|
||||
steps are be run from here.
|
||||
steps will be run from here.
|
||||
|
||||
The `steps` section describes describes everything: fetching the Zulip
|
||||
The `steps` section describes everything: fetching the Zulip
|
||||
code, provisioning, fetching caught data, running tests and uploading
|
||||
coverage reports. The steps with prefix `*` reference aliases, which
|
||||
are defined in the `aliases` section at the top of the file.
|
||||
|
|
|
@ -338,7 +338,7 @@ authentication, that made outgoing HTTP requests to external
|
|||
servers. We test those features using the excellent
|
||||
[responses](https://pypi.org/project/responses/) library, which has a
|
||||
nice interface for mocking `requests` calls to return whatever HTTP
|
||||
response from the exteranl server we need for the test. you can find
|
||||
response from the external server we need for the test. you can find
|
||||
examples with `git grep responses.add`. Zulip's own `HostRequestMock`
|
||||
class should be used only for low-level tests for code that expects to
|
||||
receive Django HttpRequest object.
|
||||
|
|
|
@ -108,7 +108,7 @@ These tools/features are often useful when debugging:
|
|||
of Puppeteer so you can watch what's happening, and document how to
|
||||
make that work with Vagrant.
|
||||
- TODO: Document `--interactive`.
|
||||
- TODO: Document how to run 100x in CI to check for nondeterminstic
|
||||
- TODO: Document how to run 100x in CI to check for nondeterministic
|
||||
failures.
|
||||
- TODO: Document any other techniques/ideas that were helpful when porting
|
||||
the Casper suite.
|
||||
|
@ -135,7 +135,7 @@ notes above:
|
|||
- Run just the file containing your new tests as described above to
|
||||
have a fast debugging cycle.
|
||||
- When you're done writing a test, run it 100 times in a loop to
|
||||
verify it does not fail nondeterminstically (see above for notes on
|
||||
verify it does not fail nondeterministically (see above for notes on
|
||||
how to get CI to do it for you); this is important to avoid
|
||||
introducing extremely annoying nondeterministic failures into
|
||||
`main`.
|
||||
|
|
|
@ -39,7 +39,7 @@ continually recheck the files as you edit them.
|
|||
|
||||
## Linting and style
|
||||
|
||||
We use the Eslint plugin for TypeScript to lint TypeScript code, just
|
||||
We use the ESLint plugin for TypeScript to lint TypeScript code, just
|
||||
like we do for JavaScript. Our long-term goal is to use an idiomatic
|
||||
TypeScript style for our TypeScript codebase.
|
||||
|
||||
|
@ -49,7 +49,7 @@ JavaScript code, so that we can easily migrate individual modules
|
|||
without too much code churn. A few examples:
|
||||
|
||||
- TypeScript generally prefers explicit `return undefined;`, whereas
|
||||
our existing JavasScript style uses just `return;`.
|
||||
our existing JavaScript style uses just `return;`.
|
||||
- With TypeScript, we expect to make heavy use of `let` and `const`
|
||||
rather than `var`.
|
||||
- With TypeScript/ES6, we may no longer need to use `_.each()` as our
|
||||
|
|
|
@ -20,7 +20,7 @@ in a more colloquial style, German translations should be rather informal as wel
|
|||
say _"Dieser Fehler tritt häufiger auf."_
|
||||
|
||||
- "Das ist die Seite, wo der Quelltext steht." - the "_wo_" is regional,
|
||||
say _"Das ist die Seite, auf der der Quelltext steht."_ instead.
|
||||
say _"Das ist die Seite, auf der Quelltext steht."_ instead.
|
||||
|
||||
### Form of address
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ to understand when implementing an internationalized application:
|
|||
translate the content.
|
||||
- **Word order** varies between languages (e.g. some languages put
|
||||
subjects before verbs, others the other way around). This means
|
||||
that **concatenating translateable strings** produces broken results
|
||||
that **concatenating translatable strings** produces broken results
|
||||
(more details with examples are below).
|
||||
- The **width of the string needed to express something** varies
|
||||
dramatically between languages; this means you can't just hardcode a
|
||||
|
@ -202,7 +202,7 @@ class Realm(models.Model):
|
|||
STREAM_EVENTS_NOTIFICATION_TOPIC = gettext_lazy('stream events')
|
||||
```
|
||||
|
||||
To ensure we always internationalize our JSON errors messages, the
|
||||
To ensure we always internationalize our JSON error messages, the
|
||||
Zulip linter (`tools/lint`) attempts to verify correct usage.
|
||||
|
||||
## Frontend translations
|
||||
|
|
|
@ -7,7 +7,7 @@ Zulip.
|
|||
Additionally, the Zulip UI is translated into more than a dozen major
|
||||
languages, including Spanish, German, Hindi, French, Chinese, Russian,
|
||||
and Japanese, and we're always excited to add more. If you speak a
|
||||
language other than English, your help with translating Zulip is be
|
||||
language other than English, your help with translating Zulip would be
|
||||
greatly appreciated!
|
||||
|
||||
If you are interested in knowing about the technical end-to-end
|
||||
|
|
|
@ -102,7 +102,7 @@ Templates for the main website are found in
|
|||
|
||||
## Writing API REST endpoints
|
||||
|
||||
These are code-parseable views that take x-www-form-urlencoded or JSON
|
||||
These are code-parsable views that take x-www-form-urlencoded or JSON
|
||||
request bodies, and return JSON-string responses. Almost all Zulip
|
||||
view code is in the implementations of API REST endpoints.
|
||||
|
||||
|
@ -135,7 +135,7 @@ one of several bad outcomes:
|
|||
- Every view function comes with another function that does the
|
||||
validation that has the problems from the last bullet point.
|
||||
|
||||
In Zulip, we solve this problem with a the special decorator called
|
||||
In Zulip, we solve this problem with a special decorator called
|
||||
`has_request_variables` which allows a developer to declare the
|
||||
arguments a view function takes and validate their types all within
|
||||
the `def` line of the function. We like this framework because we
|
||||
|
@ -275,7 +275,7 @@ def update_realm(
|
|||
|
||||
`realm.save()` actually saves the changes to the realm to the
|
||||
database, and `send_event` sends the event to active clients belonging
|
||||
to the provided list of users (in this case, all altive users in the
|
||||
to the provided list of users (in this case, all active users in the
|
||||
Zulip realm).
|
||||
|
||||
### Calling from the web application
|
||||
|
|
|
@ -242,7 +242,7 @@ test("compose fade interactions (PMs)", () => {
|
|||
return buddy_data.get_item(fred.user_id).faded;
|
||||
}
|
||||
|
||||
// Dont fade if we're not in a narrow.
|
||||
// Don't fade if we're not in a narrow.
|
||||
assert.equal(faded(), false);
|
||||
|
||||
// Fade fred if we are narrowed to a PM narrow that does
|
||||
|
|
|
@ -21,7 +21,7 @@ page_params.translation_data = {
|
|||
};
|
||||
|
||||
// Re-register Zulip extensions so extensions registered previously with
|
||||
// mocked i18n.ts do not interefere with following tests.
|
||||
// mocked i18n.ts do not interfere with following tests.
|
||||
require("../../static/js/templates");
|
||||
|
||||
// All of our other tests stub out i18n activity;
|
||||
|
|
|
@ -845,7 +845,7 @@ run_test("Multiselect dropdown retain_selected_items", () => {
|
|||
container.html = () => {};
|
||||
container.find = (elem) => DropdownItem(elem);
|
||||
|
||||
// We essentially create fake Jquery functions
|
||||
// We essentially create fake jQuery functions
|
||||
// whose return value are stored in objects so that
|
||||
// they can be later asserted with expected values.
|
||||
function DropdownItem(element) {
|
||||
|
|
|
@ -347,7 +347,7 @@ test("muted_message_vars", () => {
|
|||
|
||||
test("merge_message_groups", () => {
|
||||
// MessageListView has lots of DOM code, so we are going to test the message
|
||||
// group mearging logic on its own.
|
||||
// group merging logic on its own.
|
||||
|
||||
function build_message_context(message = {}, message_context = {}) {
|
||||
message_context = {
|
||||
|
|
|
@ -62,14 +62,14 @@ test("add_and_remove_mutes", () => {
|
|||
muted_topics.add_muted_topic(devel.stream_id, "java");
|
||||
assert.ok(muted_topics.is_topic_muted(devel.stream_id, "java"));
|
||||
|
||||
// test idempotentcy
|
||||
// test idempotency
|
||||
muted_topics.add_muted_topic(devel.stream_id, "java");
|
||||
assert.ok(muted_topics.is_topic_muted(devel.stream_id, "java"));
|
||||
|
||||
muted_topics.remove_muted_topic(devel.stream_id, "java");
|
||||
assert.ok(!muted_topics.is_topic_muted(devel.stream_id, "java"));
|
||||
|
||||
// test idempotentcy
|
||||
// test idempotency
|
||||
muted_topics.remove_muted_topic(devel.stream_id, "java");
|
||||
assert.ok(!muted_topics.is_topic_muted(devel.stream_id, "java"));
|
||||
|
||||
|
@ -81,14 +81,14 @@ test("add_and_remove_mutes", () => {
|
|||
muted_users.add_muted_user(1);
|
||||
assert.ok(muted_users.is_user_muted(1));
|
||||
|
||||
// test idempotentcy
|
||||
// test idempotency
|
||||
muted_users.add_muted_user(1);
|
||||
assert.ok(muted_users.is_user_muted(1));
|
||||
|
||||
muted_users.remove_muted_user(1);
|
||||
assert.ok(!muted_users.is_user_muted(1));
|
||||
|
||||
// test idempotentcy
|
||||
// test idempotency
|
||||
muted_users.remove_muted_user(1);
|
||||
assert.ok(!muted_users.is_user_muted(1));
|
||||
});
|
||||
|
|
|
@ -18,7 +18,7 @@ function test_with(fixture) {
|
|||
narrow_state.set_current_filter(filter);
|
||||
|
||||
// Make sure our simulated tests data satisfies the
|
||||
// invarariant that the first unread message we find
|
||||
// invariant that the first unread message we find
|
||||
// does indeed satisfy our filter.
|
||||
if (fixture.unread_info.flavor === "found") {
|
||||
for (const msg of fixture.all_messages) {
|
||||
|
|
|
@ -21,7 +21,7 @@ let sort_recipients_called = false;
|
|||
let sort_streams_called = false;
|
||||
const fake_rendered_person = $.create("fake-rendered-person");
|
||||
const fake_rendered_stream = $.create("fake-rendered-stream");
|
||||
const fake_rendered_group = $.create("fake-redered-group");
|
||||
const fake_rendered_group = $.create("fake-rendered-group");
|
||||
|
||||
mock_esm("../../static/js/typeahead_helper", {
|
||||
render_person() {
|
||||
|
|
|
@ -320,7 +320,7 @@ test("sending", ({override, override_rewire}) => {
|
|||
|
||||
emoji_name = "inactive_realm_emoji";
|
||||
{
|
||||
// Test removing a deactivated realm emoji. An user can interact with a
|
||||
// Test removing a deactivated realm emoji. A user can interact with a
|
||||
// deactivated realm emoji only by clicking on a reaction, hence, only
|
||||
// `process_reaction_click()` codepath supports deleting/adding a deactivated
|
||||
// realm emoji.
|
||||
|
|
|
@ -911,7 +911,7 @@ test("test_topic_edit", ({override, override_rewire}) => {
|
|||
assert.equal(all_topics.get(get_topic_key(stream2, topic1)), undefined);
|
||||
verify_topic_data(all_topics, stream3, topic9, messages[0].id, true);
|
||||
|
||||
// Message was moveed to a deleted stream, hence hidden regardless of filter.
|
||||
// Message was moved to a deleted stream, hence hidden regardless of filter.
|
||||
messages[0].stream_id = stream5;
|
||||
messages[0].topic = topic8;
|
||||
rt.process_topic_edit(stream3, topic9, topic8, stream5);
|
||||
|
|
|
@ -241,7 +241,7 @@ run_test("stream-links", () => {
|
|||
|
||||
run_test("timestamp without time", () => {
|
||||
const $content = get_content_element();
|
||||
const $timestamp = $.create("timestampe without actual time");
|
||||
const $timestamp = $.create("timestamp without actual time");
|
||||
$content.set_find_results("time", $array([$timestamp]));
|
||||
|
||||
rm.update_elements($content);
|
||||
|
|
|
@ -524,7 +524,7 @@ test("sort_recipients subscribers", () => {
|
|||
|
||||
test("sort_recipients pm partners", () => {
|
||||
// b_user_3 is a pm partner and b_user_2 is not and
|
||||
// both are not subscribered to the stream Linux.
|
||||
// both are not subscribed to the stream Linux.
|
||||
const small_matches = [b_user_3, b_user_2];
|
||||
const recipients = th.sort_recipients({
|
||||
users: small_matches,
|
||||
|
|
|
@ -232,7 +232,7 @@ run_test("eq_array easy cases", () => {
|
|||
assert.equal(vdom.eq_array(x, z, eq), false);
|
||||
});
|
||||
|
||||
run_test("eq_array elementwise", () => {
|
||||
run_test("eq_array element-wise", () => {
|
||||
const a = [51, 32, 93];
|
||||
const b = [31, 52, 43];
|
||||
const eq = (a, b) => a % 10 === b % 10;
|
||||
|
|
|
@ -62,7 +62,7 @@ run_test("basics", () => {
|
|||
blueslip.reset();
|
||||
});
|
||||
|
||||
// Let's repeat the above procedue with warnings. Unlike errors,
|
||||
// Let's repeat the above procedure with warnings. Unlike errors,
|
||||
// warnings shouldn't stop the code execution, and thus, the
|
||||
// behaviour is slightly different.
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ What is zjquery?
|
|||
complexity of jQuery. It also allows you to mostly simulate DOM for the
|
||||
purposes of unit testing, so that your tests focus on component interactions
|
||||
that aren't super tightly coupled to building the DOM. The tests also run
|
||||
faster! Inorder to keep zjquery light, it only has stubs for the most commonly
|
||||
faster! In order to keep zjquery light, it only has stubs for the most commonly
|
||||
used functions of jQuery. This means that it is possible that you may need to
|
||||
stub out additional functions manually in the relevant test module.
|
||||
|
||||
|
|
|
@ -409,7 +409,7 @@ class CommonUtils {
|
|||
}
|
||||
|
||||
/**
|
||||
* This method returns a array, which is formmated as:
|
||||
* This method returns a array, which is formatted as:
|
||||
* [
|
||||
* ['stream > topic', ['message 1', 'message 2']],
|
||||
* ['You and Cordelia, Lear's daughter', ['message 1', 'message 2']]
|
||||
|
|
|
@ -164,7 +164,7 @@ async function test_markdown_preview_buttons_visibility(page: Page): Promise<voi
|
|||
await page.waitForSelector(markdown_preview_button, {visible: true});
|
||||
await page.waitForSelector(markdown_preview_hide_button, {hidden: true});
|
||||
|
||||
// verify if markdowm preview button works.
|
||||
// verify if Markdown preview button works.
|
||||
await page.click(markdown_preview_button);
|
||||
await page.waitForSelector(markdown_preview_button, {hidden: true});
|
||||
await page.waitForSelector(markdown_preview_hide_button, {visible: true});
|
||||
|
|
|
@ -4,7 +4,7 @@ import type {Page} from "puppeteer";
|
|||
|
||||
import common from "../puppeteer_lib/common";
|
||||
|
||||
async function wait_for_drafts_to_dissapear(page: Page): Promise<void> {
|
||||
async function wait_for_drafts_to_disappear(page: Page): Promise<void> {
|
||||
await page.waitForFunction(
|
||||
() => $("#draft_overlay").length === 0 || $("#draft_overlay").css("opacity") === "0",
|
||||
);
|
||||
|
@ -32,7 +32,7 @@ async function test_empty_drafts(page: Page): Promise<void> {
|
|||
assert.strictEqual(await common.get_text_from_selector(page, ".drafts-list"), "No drafts.");
|
||||
|
||||
await page.click(`${drafts_overlay} .exit`);
|
||||
await wait_for_drafts_to_dissapear(page);
|
||||
await wait_for_drafts_to_disappear(page);
|
||||
}
|
||||
|
||||
async function create_stream_message_draft(page: Page): Promise<void> {
|
||||
|
@ -117,7 +117,7 @@ async function test_previously_created_drafts_rendered(page: Page): Promise<void
|
|||
async function test_restore_message_draft(page: Page): Promise<void> {
|
||||
console.log("Restoring stream message draft");
|
||||
await page.click("#drafts_table .message_row:not(.private-message) .restore-draft");
|
||||
await wait_for_drafts_to_dissapear(page);
|
||||
await wait_for_drafts_to_disappear(page);
|
||||
await page.waitForSelector("#stream-message", {visible: true});
|
||||
await page.waitForSelector("#preview_message_area", {hidden: true});
|
||||
await common.check_form_contents(page, "form#send_message_form", {
|
||||
|
@ -172,7 +172,7 @@ async function test_edited_draft_message(page: Page): Promise<void> {
|
|||
async function test_restore_private_message_draft(page: Page): Promise<void> {
|
||||
console.log("Restoring private message draft.");
|
||||
await page.click("#drafts_table .message_row.private-message .restore-draft");
|
||||
await wait_for_drafts_to_dissapear(page);
|
||||
await wait_for_drafts_to_disappear(page);
|
||||
await page.waitForSelector("#private-message", {visible: true});
|
||||
await common.check_form_contents(page, "form#send_message_form", {
|
||||
content: "Test private message.",
|
||||
|
@ -198,7 +198,7 @@ async function test_delete_draft(page: Page): Promise<void> {
|
|||
assert.strictEqual(drafts_count, 1, "Draft not deleted.");
|
||||
await page.waitForSelector("#drafts_table .message_row.private-message", {hidden: true});
|
||||
await page.click(`${drafts_overlay} .exit`);
|
||||
await wait_for_drafts_to_dissapear(page);
|
||||
await wait_for_drafts_to_disappear(page);
|
||||
await page.click("body");
|
||||
}
|
||||
|
||||
|
|
|
@ -338,7 +338,7 @@ async function test_stream_search_filters_stream_list(page: Page): Promise<void>
|
|||
await page.click(".stream-list-filter");
|
||||
|
||||
await page.waitForSelector("#stream_filters .highlighted_stream", {visible: true});
|
||||
// First stream in list gets highlihted on clicking search.
|
||||
// First stream in list gets highlighted on clicking search.
|
||||
await page.waitForSelector((await get_stream_li(page, "core team")) + ".highlighted_stream", {
|
||||
visible: true,
|
||||
});
|
||||
|
|
|
@ -20,7 +20,7 @@ async function realm_creation_tests(page: Page): Promise<void> {
|
|||
page.$eval("#send_confirm", (form) => (form as HTMLFormElement).submit()),
|
||||
]);
|
||||
|
||||
// Make sure onfirmation email is sent.
|
||||
// Make sure confirmation email is sent.
|
||||
assert.ok(page.url().includes("/accounts/new/send_confirm/" + email));
|
||||
|
||||
// Special endpoint enabled only during tests for extracting confirmation key
|
||||
|
|
|
@ -118,7 +118,7 @@ async function test_webhook_bot_creation(page: Page): Promise<void> {
|
|||
assert.match(
|
||||
zuliprc_decoded_url,
|
||||
outgoing_webhook_zuliprc_regex,
|
||||
"Incorrect outgoing webhook bot zulirc format",
|
||||
"Incorrect outgoing webhook bot zuliprc format",
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -162,7 +162,7 @@ class MarkdownComparer {
|
|||
message:
|
||||
message +
|
||||
[
|
||||
"actual and expected output produce semantially identical HTML",
|
||||
"actual and expected output produce semantically identical HTML",
|
||||
actual,
|
||||
"==",
|
||||
expected,
|
||||
|
|
|
@ -47,7 +47,7 @@ tblib
|
|||
# For linting Git commit messages
|
||||
gitlint-core
|
||||
|
||||
# Needed for visualising cprofile reports
|
||||
# Needed for visualising cProfile reports
|
||||
snakeviz
|
||||
|
||||
# Needed for creating DigitalOcean droplets
|
||||
|
|
|
@ -55,7 +55,7 @@ def inline_template(template_source_name: str) -> None:
|
|||
# adding html, head, and body tags if they aren't there.
|
||||
# While this is correct for the email_base_default template,
|
||||
# it is wrong for the other templates that extend this
|
||||
# template, since we'll end up with 2 copipes of those tags.
|
||||
# template, since we'll end up with 2 copies of those tags.
|
||||
# Thus, we strip this stuff out if the template extends
|
||||
# another template.
|
||||
if template_name not in ["email_base_default", "email_base_marketing", "macros"]:
|
||||
|
|
|
@ -78,7 +78,7 @@ function call(args, idempotent) {
|
|||
}
|
||||
|
||||
if (page_params.is_spectator) {
|
||||
// In theory, the specator implementation should be
|
||||
// In theory, the spectator implementation should be
|
||||
// designed to prevent accessing widgets that would
|
||||
// make network requests not available to spectators.
|
||||
//
|
||||
|
|
|
@ -647,7 +647,7 @@ export function initialize() {
|
|||
on_timestamp_selection,
|
||||
new Date(),
|
||||
{
|
||||
// place the time picker above the icon and centerize it horizontally
|
||||
// place the time picker above the icon and center it horizontally
|
||||
position: "above center",
|
||||
},
|
||||
);
|
||||
|
|
|
@ -114,7 +114,7 @@ export function initialize() {
|
|||
update_reply_recipient_label();
|
||||
});
|
||||
|
||||
// Click handlers for buttons in the compose compose box.
|
||||
// Click handlers for buttons in the compose box.
|
||||
$("body").on("click", ".compose_stream_button", () => {
|
||||
compose_actions.start("stream", {trigger: "new topic button"});
|
||||
});
|
||||
|
|
|
@ -162,7 +162,7 @@ export function make_compose_box_full_size() {
|
|||
set_full_size(true);
|
||||
|
||||
// The autosize should be destroyed for the full size compose
|
||||
// box else it will interfare and shrink its size accordingly.
|
||||
// box else it will interfere and shrink its size accordingly.
|
||||
autosize.destroy($("#compose-textarea"));
|
||||
|
||||
$("#compose").addClass("compose-fullscreen");
|
||||
|
@ -195,7 +195,7 @@ export function make_compose_box_original_size() {
|
|||
export function handle_keydown(event, textarea) {
|
||||
// The event.key property will have uppercase letter if
|
||||
// the "Shift + <key>" combo was used or the Caps Lock
|
||||
// key was on. We turn to key to lowercase so the keybindings
|
||||
// key was on. We turn to key to lowercase so the key bindings
|
||||
// work regardless of whether Caps Lock was on or not.
|
||||
const key = event.key.toLowerCase();
|
||||
let type;
|
||||
|
|
|
@ -34,7 +34,7 @@ import {user_settings} from "./user_settings";
|
|||
// And your input to them is rendered as though it were HTML by
|
||||
// the default highlighter.
|
||||
//
|
||||
// So if you are not using trusted input, you MUST use the a
|
||||
// So if you are not using trusted input, you MUST use a
|
||||
// highlighter that escapes (i.e. one that calls
|
||||
// typeahead_helper.highlight_with_escaping).
|
||||
|
||||
|
|
|
@ -263,7 +263,7 @@ export function try_deliver_locally(message_request) {
|
|||
|
||||
export function edit_locally(message, request) {
|
||||
// Responsible for doing the rendering work of locally editing the
|
||||
// content ofa message. This is used in several code paths:
|
||||
// content of a message. This is used in several code paths:
|
||||
// * Editing a message where a message was locally echoed but
|
||||
// it got an error back from the server
|
||||
// * Locally echoing any content-only edits to fully sent messages
|
||||
|
|
|
@ -17,7 +17,7 @@ This code lets you show something like this:
|
|||
And then you configure the undo behavior, and
|
||||
everything else is controlled by the widget.
|
||||
|
||||
Codewise it's a singleton widget that controls the DOM inside
|
||||
Code-wise it's a singleton widget that controls the DOM inside
|
||||
#feedback_container, which gets served up by server.
|
||||
|
||||
*/
|
||||
|
|
|
@ -9,7 +9,7 @@ function max_id_for_messages(messages) {
|
|||
}
|
||||
|
||||
export class FetchStatus {
|
||||
// The FetchStatus object tracks tracks the state of a
|
||||
// The FetchStatus object tracks the state of a
|
||||
// message_list_data object, whether rendered in the DOM or not,
|
||||
// and is the source of truth for whether the message_list_data
|
||||
// object has the complete history of the view or whether more
|
||||
|
@ -82,7 +82,7 @@ export class FetchStatus {
|
|||
// When a new message arrives matching the current view
|
||||
// and found_newest is false, we cannot add the message to
|
||||
// the view in-order without creating invalid output
|
||||
// (where two messages are displaye adjacent but might be
|
||||
// (where two messages are display adjacent but might be
|
||||
// weeks and hundreds of messages apart in actuality).
|
||||
//
|
||||
// So we have to discard those messages. Usually, this is
|
||||
|
|
|
@ -97,7 +97,7 @@ export function get_language_list_columns(default_language: string): LanguageLis
|
|||
const seconds = _.range(firsts_end, language_len);
|
||||
const longest_zip: [number, number][] = [];
|
||||
|
||||
// Create a zip (itertool.zip_longest in python)
|
||||
// Create a zip (itertools.zip_longest in python)
|
||||
for (const value of firsts) {
|
||||
longest_zip.push([value, seconds[value]]);
|
||||
}
|
||||
|
|
|
@ -141,7 +141,7 @@ export function create(opts) {
|
|||
return true;
|
||||
},
|
||||
|
||||
// this searches given a particlar pill ID for it, removes the node
|
||||
// this searches given a particular pill ID for it, removes the node
|
||||
// from the DOM, removes it from the array and returns it.
|
||||
// this would generally be used for DOM-provoked actions, such as a user
|
||||
// clicking on a pill to remove it.
|
||||
|
@ -200,7 +200,7 @@ export function create(opts) {
|
|||
// of pills for the user to fix.
|
||||
const drafts = pills.filter(
|
||||
(pill) =>
|
||||
// if this returns `false`, it erroed and we should push it to
|
||||
// if this returns `false`, it errored and we should push it to
|
||||
// the draft pills.
|
||||
funcs.appendPill(pill) === false,
|
||||
);
|
||||
|
|
|
@ -43,7 +43,7 @@ export class PanZoomControl {
|
|||
}, 0);
|
||||
});
|
||||
|
||||
// keybinds
|
||||
// key bindings
|
||||
document.addEventListener("keydown", (e) => {
|
||||
if (!overlays.lightbox_open()) {
|
||||
return;
|
||||
|
|
|
@ -446,7 +446,7 @@ export function initialize(helper_config) {
|
|||
return translate_emoticons_to_names(src);
|
||||
}
|
||||
|
||||
// Disable lheadings
|
||||
// Disable headings
|
||||
// We only keep the # Heading format.
|
||||
disable_markdown_regex(marked.Lexer.rules.tables, "lheading");
|
||||
|
||||
|
|
|
@ -491,7 +491,7 @@ export function initialize(home_view_loaded) {
|
|||
// (Users will see a weird artifact where Recent topics has a gap
|
||||
// between E.g. 6 days ago and 37 days ago while the catchup
|
||||
// process runs, so this strategy still results in problematic
|
||||
// visual artifacts shortly after page load; just more forgiveable
|
||||
// visual artifacts shortly after page load; just more forgivable
|
||||
// ones).
|
||||
//
|
||||
// This MessageList is defined similarly to home_message_list,
|
||||
|
|
|
@ -660,7 +660,7 @@ export class MessageListView {
|
|||
|
||||
// The messages we are being asked to render are shared with between
|
||||
// all messages lists. To prevent having both list views overwriting
|
||||
// each others data we will make a new message object to add data to
|
||||
// each others' data we will make a new message object to add data to
|
||||
// for rendering.
|
||||
const message_containers = messages.map((message) => {
|
||||
if (message.starred) {
|
||||
|
@ -723,7 +723,7 @@ export class MessageListView {
|
|||
this._post_process(dom_messages);
|
||||
|
||||
// The date row will be included in the message groups or will be
|
||||
// added in a rerenderd in the group below
|
||||
// added in a rerendered in the group below
|
||||
table.find(".recipient_row").first().prev(".date_row").remove();
|
||||
table.prepend(rendered_groups);
|
||||
condense.condense_and_collapse(dom_messages);
|
||||
|
@ -932,7 +932,7 @@ export class MessageListView {
|
|||
// background and might be having some functionality
|
||||
// throttled by modern Chrome's aggressive power-saving
|
||||
// features.
|
||||
blueslip.log("Suppressing scrolldown due to inactivity");
|
||||
blueslip.log("Suppressing scroll down due to inactivity");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -162,7 +162,7 @@ export function reset_ui_state() {
|
|||
}
|
||||
|
||||
export function activate(raw_operators, opts) {
|
||||
/* Main entrypoint for switching to a new view / message list.
|
||||
/* Main entry point for switching to a new view / message list.
|
||||
Note that for historical reasons related to the current
|
||||
client-side caching structure, the "All messages"/message_lists.home
|
||||
view is reached via `narrow.deactivate()`.
|
||||
|
|
|
@ -175,7 +175,7 @@ export function get_first_unread_info() {
|
|||
|
||||
if (!current_filter.can_apply_locally()) {
|
||||
// For things like search queries, where the server has info
|
||||
// that the client isn't privvy to, we need to wait for the
|
||||
// that the client isn't privy to, we need to wait for the
|
||||
// server to give us a definitive list of messages before
|
||||
// deciding where we'll move the selection.
|
||||
return {
|
||||
|
|
|
@ -109,7 +109,7 @@ export function initialize() {
|
|||
|
||||
// We need to hide instance manually for popover due to
|
||||
// `$("body").on("click"...` method not being triggered for
|
||||
// the elements when when we do:
|
||||
// the elements when we do:
|
||||
// `$(instance.popper).one("click", instance.hide); in onShow.
|
||||
// Cannot reproduce it on codepen -
|
||||
// https://codepen.io/amanagr/pen/jOLoKVg
|
||||
|
|
|
@ -714,7 +714,7 @@ export function user_sidebar_popped() {
|
|||
export function hide_user_sidebar_popover() {
|
||||
if (user_sidebar_popped()) {
|
||||
// this hide_* method looks different from all the others since
|
||||
// the presence list may be redrawn. Due to funkiness with jquery's .data()
|
||||
// the presence list may be redrawn. Due to funkiness with jQuery's .data()
|
||||
// this would confuse $.popover("destroy"), which looks at the .data() attached
|
||||
// to a certain element. We thus save off the .data("popover") in the
|
||||
// show_user_sidebar_popover and inject it here before calling destroy.
|
||||
|
@ -1244,7 +1244,7 @@ export function register_click_handlers() {
|
|||
.fadeOut(300);
|
||||
|
||||
setTimeout(() => {
|
||||
// The Cliboard library works by focusing to a hidden textarea.
|
||||
// The Clipboard library works by focusing to a hidden textarea.
|
||||
// We unfocus this so keyboard shortcuts, etc., will work again.
|
||||
$(":focus").trigger("blur");
|
||||
}, 0);
|
||||
|
|
|
@ -27,7 +27,7 @@ function preserve_state(send_after_reload, save_pointer, save_narrow, save_compo
|
|||
// no secure way to pass that state in a signed fashion to the
|
||||
// next instance of the browser client).
|
||||
//
|
||||
// So we jure return here and let the reload proceed without
|
||||
// So we just return here and let the reload proceed without
|
||||
// having preserved state. We keep the hash the same so we'll
|
||||
// at least save their narrow state.
|
||||
blueslip.log("Can't preserve state; no local storage.");
|
||||
|
|
|
@ -21,7 +21,7 @@ function getScrollbarWidth() {
|
|||
// force scrollbars
|
||||
outer.style.overflow = "scroll";
|
||||
|
||||
// add innerdiv
|
||||
// add inner div
|
||||
const inner = document.createElement("div");
|
||||
inner.style.width = "100%";
|
||||
outer.append(inner);
|
||||
|
|
|
@ -67,7 +67,7 @@ export function do_settings_change(
|
|||
}
|
||||
|
||||
// This function is used to disable sub-setting when main setting is checked or unchecked
|
||||
// or two settings are inter-dependent on their values values.
|
||||
// or two settings are inter-dependent on their values.
|
||||
// * is_checked is boolean, shows if the main setting is checked or not.
|
||||
// * sub_setting_id is sub setting or setting which depend on main setting,
|
||||
// string id of setting.
|
||||
|
|
|
@ -399,7 +399,7 @@ function get_human_profile_data(fields_user_pills) {
|
|||
*/
|
||||
const new_profile_data = [];
|
||||
$("#edit-user-form .custom_user_field_value").each(function () {
|
||||
// Remove duplicate datepicker input element generated flatpicker library
|
||||
// Remove duplicate datepicker input element generated flatpickr library
|
||||
if (!$(this).hasClass("form-control")) {
|
||||
new_profile_data.push({
|
||||
id: Number.parseInt(
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// Module for displaying the modal asking spectators to login when
|
||||
// attempting to do things that are not possible as a specatator (like
|
||||
// attempting to do things that are not possible as a spectator (like
|
||||
// add an emoji reaction, star a message, etc.). While in many cases,
|
||||
// we will prefer to hide menu options that don't make sense for
|
||||
// spectators, this modal is useful for everything that doesn't make
|
||||
|
|
|
@ -29,7 +29,7 @@ export let stream_cursor;
|
|||
let has_scrolled = false;
|
||||
|
||||
export function update_count_in_dom(stream_li, count) {
|
||||
// The subsription_block properly excludes the topic list,
|
||||
// The subscription_block properly excludes the topic list,
|
||||
// and it also has sensitive margins related to whether the
|
||||
// count is there or not.
|
||||
const subscription_block = stream_li.find(".subscription_block");
|
||||
|
|
|
@ -253,7 +253,7 @@ export function add_sub_to_table(sub) {
|
|||
// If a stream is already listed/added in subscription modal,
|
||||
// display stream in `Subscribed` tab and return.
|
||||
// This can happen in some corner cases (which might
|
||||
// be backend bugs) where a realm adminsitrator is subscribed
|
||||
// be backend bugs) where a realm administrator is subscribed
|
||||
// to a private stream, in which case they might get two
|
||||
// stream-create events.
|
||||
stream_ui_updates.update_stream_row_in_settings_tab(sub);
|
||||
|
|
|
@ -154,7 +154,7 @@ export function initialize() {
|
|||
$("body").on("blur", ".message_control_button", (e) => {
|
||||
// Remove tooltip when user is trying to tab through all the icons.
|
||||
// If user tabs slowly, tooltips are displayed otherwise they are
|
||||
// distroyed before they can be displayed.
|
||||
// destroyed before they can be displayed.
|
||||
e.currentTarget._tippy.destroy();
|
||||
});
|
||||
|
||||
|
|
|
@ -203,7 +203,7 @@ export function activate(opts) {
|
|||
e.stopPropagation();
|
||||
|
||||
if (page_params.is_spectator) {
|
||||
// Logically, spectators should not be able totoggle
|
||||
// Logically, spectators should not be able to toggle
|
||||
// TODO checkboxes. However, the browser changes the
|
||||
// checkbox's state before calling handlers like this,
|
||||
// so we need to just toggle the checkbox back to its
|
||||
|
|
|
@ -317,7 +317,7 @@ export function sort_recipients({
|
|||
The following optimization is important for large realms.
|
||||
If we know we're only showing 5 suggestions, and we
|
||||
get 5 matches from `best_users`, then we want to avoid
|
||||
calling the expensives sorts for `ok_users` and `worst_users`,
|
||||
calling the expensive sorts for `ok_users` and `worst_users`,
|
||||
since they just get dropped.
|
||||
*/
|
||||
|
||||
|
|
|
@ -477,7 +477,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
/* Style copy-to-clipboard button inside codeblocks */
|
||||
/* Style copy-to-clipboard button inside code blocks */
|
||||
.copy_codeblock {
|
||||
visibility: hidden;
|
||||
/* Having absolute positioning here ensures that the element
|
||||
|
|
|
@ -1518,7 +1518,7 @@ input[type="checkbox"] {
|
|||
.content-wrapper {
|
||||
position: absolute;
|
||||
left: 251px;
|
||||
/* the width of the settings sidbar this is right of is 250px + 1px border. */
|
||||
/* the width of the settings sidebar this is right of is 250px + 1px border. */
|
||||
width: calc(100% - 250px - 1px);
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
|
|
|
@ -470,7 +470,7 @@ li,
|
|||
padding: 6px;
|
||||
display: block;
|
||||
/* The below two avoids the padded element from displaying
|
||||
it's own border and background color */
|
||||
its own border and background color */
|
||||
border: none;
|
||||
background-clip: content-box;
|
||||
/* The z-index here ensures that the copy-message
|
||||
|
@ -1188,7 +1188,7 @@ td.pointer {
|
|||
border-left-color: hsl(0, 0%, 27%);
|
||||
}
|
||||
|
||||
/* Base color backgrounds for messageboxes,
|
||||
/* Base color backgrounds for message boxes,
|
||||
private messages, mentions, and unread messages */
|
||||
|
||||
.message-header-contents {
|
||||
|
|
|
@ -244,7 +244,7 @@
|
|||
|
||||
<div class="input-group">
|
||||
<label for="realm_add_custom_emoji_policy" class="dropdown-title">{{t "Who can add custom emoji" }}</label>
|
||||
<select name="realm_add_cutsom_emoji_policy" class="setting-widget prop-element" id="id_realm_add_custom_emoji_policy" data-setting-widget-type="number">
|
||||
<select name="realm_add_custom_emoji_policy" class="setting-widget prop-element" id="id_realm_add_custom_emoji_policy" data-setting-widget-type="number">
|
||||
{{> dropdown_options_widget option_values=common_policy_values}}
|
||||
</select>
|
||||
</div>
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
*
|
||||
* This adds support for completing a typeahead on custom keyup input. By
|
||||
* default, we only support Tab and Enter to complete a typeahead, but we
|
||||
* have usecases where we want to complete using custom characters like: >.
|
||||
* have use cases where we want to complete using custom characters like: >.
|
||||
*
|
||||
* If `this.trigger_selection` returns true, we complete the typeahead and
|
||||
* pass the keyup event to the updater.
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
</li>
|
||||
<li>The first time, you'll need to type <code>Ctrl-A c</code> to switch to a new terminal in your screen session.</li>
|
||||
<li><code>kinit -l7d && aklog</code></li>
|
||||
<li>(Type type your password to renew your Kerberos tickets).</li>
|
||||
<li>(Type your password to renew your Kerberos tickets).</li>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
|
|
|
@ -100,7 +100,7 @@ format used by the Zulip server that they are interacting with.
|
|||
|
||||
* [`PATCH /realm`]: Added `string_id` parameter for changing an
|
||||
organization's subdomain. Currently, this is only allowed for
|
||||
changing changing a demo organization to a normal one.
|
||||
changing a demo organization to a normal one.
|
||||
|
||||
**Feature level 103**
|
||||
|
||||
|
|
|
@ -89,13 +89,13 @@ below are for a webhook named `MyWebHook`.
|
|||
* `zerver/webhooks/mywebhook/fixtures/messagetype.json`: Sample json payload data
|
||||
used by tests. Add one fixture file per type of message supported by your
|
||||
integration.
|
||||
* `zerver/webhooks/mywebhook/tests.py`: Tests for your webbook.
|
||||
* `zerver/webhooks/mywebhook/tests.py`: Tests for your webhook.
|
||||
* `zerver/webhooks/mywebhook/doc.md`: End-user documentation explaining
|
||||
how to add the integration.
|
||||
* `static/images/integrations/logos/mywebhook.svg`: A square logo for the
|
||||
platform/server/product you are integrating. Used on the documentation
|
||||
pages as well as the sender's avatar for messages sent by the integration.
|
||||
* `static/images/integrations/mywebbook/001.svg`: A screenshot of a message
|
||||
* `static/images/integrations/mywebhook/001.svg`: A screenshot of a message
|
||||
sent by the integration, used on the documentation page. This can be
|
||||
generated by running `tools/generate-integration-docs-screenshot --integration mywebhook`.
|
||||
* `static/images/integrations/bot_avatars/mywebhook.png`: A square logo for the
|
||||
|
|
|
@ -109,7 +109,7 @@
|
|||
<span id="normal-zephyr-mirror-error-text">
|
||||
We recommend that
|
||||
you <a class="webathena_login">give Zulip the ability to mirror the messages for you via
|
||||
WebAthena</a>. If you'd prefer, you can instead
|
||||
Webathena</a>. If you'd prefer, you can instead
|
||||
<a href="/zephyr-mirror" target="_blank" rel="noopener noreferrer">run the
|
||||
Zephyr mirror script yourself</a> in a screen
|
||||
session.
|
||||
|
|
|
@ -390,7 +390,7 @@ a.button:hover {
|
|||
line-height: 100%;
|
||||
}
|
||||
|
||||
/* iOS converts adreses in emails to links automatically */
|
||||
/* iOS converts addresses in emails to links automatically */
|
||||
.apple-link a {
|
||||
color: inherit !important;
|
||||
font-family: inherit !important;
|
||||
|
|
|
@ -15,7 +15,7 @@ communication with students, and among the 30-50 person course staff.
|
|||
|
||||
[Tobias Lasser](https://ciip.in.tum.de/people/lasser.html), lecturer
|
||||
at the TUM Department of Informatics, set out to teach an introductory
|
||||
algorithms class with 1400 students in April 2020, as the Covid-19
|
||||
algorithms class with 1400 students in April 2020, as the COVID-19
|
||||
pandemic was sweeping across Europe. With instruction moving online,
|
||||
he knew that finding an effective communication platform was more
|
||||
important than ever.
|
||||
|
|
|
@ -6,7 +6,7 @@ top universities worldwide. The UCSD math department offers
|
|||
prestigious graduate and undergraduate programs, with course topics
|
||||
ranging from foundational material to cutting-edge research.
|
||||
|
||||
In response to the covid pandemic, UCSD instruction moved online early
|
||||
In response to the COVID-19 pandemic, UCSD instruction moved online early
|
||||
in 2020. As instructors scrambled to figure out online education,
|
||||
Kiran Kedlaya, Professor of Mathematics at UCSD, gave himself a bigger
|
||||
challenge: “Seeing the unique opportunity, I decided to open my
|
||||
|
|
|
@ -10,7 +10,7 @@ An organization owner can change the role of any user. An
|
|||
organization administrator can change the role of most users, but
|
||||
cannot create or demote an organization owner.
|
||||
|
||||
You can can revoke your own owner or administrative privileges if
|
||||
You can revoke your own owner or administrative privileges if
|
||||
there is at least one other owner in the organization (consider
|
||||
promoting a new owner or [deactivating the
|
||||
organization](/help/deactivate-your-organization) instead).
|
||||
|
|
|
@ -107,7 +107,7 @@ the user will get to choose which playground to open the code in.
|
|||
|
||||
* The **Language** field is the human-readable Pygments language name for that
|
||||
programming language. The language tag for a code block is internally mapped
|
||||
to these human-readable Pygments names. E.g: `py3` and `py` are mapped to
|
||||
to these human-readable Pygments names; e.g., `py3` and `py` are mapped to
|
||||
`Python`. One can use the typeahead (which appears when you type something
|
||||
or just click on the language field) to lookup the Pygments name.
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ Zulip has a number of [keyboard shortcuts](/help/keyboard-shortcuts)
|
|||
designed to enhance the user experience in the app.
|
||||
|
||||
By default, the `Esc` key shortcut will ultimately navigate to your
|
||||
default view. You can disable this keybinding if you would prefer.
|
||||
default view. You can disable this key binding if you would prefer.
|
||||
This will not disable other `Esc` key shortcuts used in Zulip,
|
||||
and will not affect the behavior of the `Ctrl+[` shortcut.
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ Copying and pasting emoji from other sites generally works.
|
|||
## Change your emoji set
|
||||
|
||||
Your emoji set determines how you see emoji. It has no effect on the emoji
|
||||
you send. Zulip emoji are compatible with screenreaders and other accessibility tools.
|
||||
you send. Zulip emoji are compatible with screen readers and other accessibility tools.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
|
|
|
@ -149,7 +149,7 @@ users to other sets of roles:
|
|||
## Manage pending invitations
|
||||
|
||||
Organization owners can revoke or resend any invitation or reusable
|
||||
invitation link. Organization administrators can can do the same
|
||||
invitation link. Organization administrators can do the same
|
||||
except for invitations for the organization owners role.
|
||||
|
||||
{start_tabs}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue