mirror of
https://github.com/flarum/core.git
synced 2025-08-13 11:54:32 +02:00
Compare commits
486 Commits
dk/harden-
...
as/v1.2.1-
Author | SHA1 | Date | |
---|---|---|---|
|
dd5c516156 | ||
|
085c44ec63 | ||
|
60600f4d2b | ||
|
7a22527b72 | ||
|
bd4d53323c | ||
|
ad69cf84fe | ||
|
aa77df46ee | ||
|
19e48617f0 | ||
|
d8b83cc372 | ||
|
a04b420295 | ||
|
5f4b5c0841 | ||
|
beae75dab3 | ||
|
e304cf7cb5 | ||
|
9f87674626 | ||
|
54329d0827 | ||
|
a7aad46068 | ||
|
7551a14ae5 | ||
|
f4c29db182 | ||
|
a291134da1 | ||
|
c702f5e228 | ||
|
749e7e34f7 | ||
|
67821d95bd | ||
|
aa44677df3 | ||
|
3978efa533 | ||
|
687e1e2789 | ||
|
7cec4d1f42 | ||
|
fbe1a48bec | ||
|
17a8d2c9d8 | ||
|
85ee80659d | ||
|
af77214967 | ||
|
7c3b51fec0 | ||
|
ed3ea05c1a | ||
|
9fd6e5d0a2 | ||
|
2541cdec94 | ||
|
8fac735be0 | ||
|
53c3d13047 | ||
|
993500aae4 | ||
|
0e9c169e06 | ||
|
94f9e7f9de | ||
|
4b25b90b48 | ||
|
a4fbf16eef | ||
|
809620750f | ||
|
066cf02b88 | ||
|
cff672424b | ||
|
2e94e31bb6 | ||
|
b7f2fe2429 | ||
|
64dab138c4 | ||
|
a55b61e058 | ||
|
206aa227f2 | ||
|
e926758060 | ||
|
ad8ac4e342 | ||
|
2e5cd6f5c3 | ||
|
d5cd0bd339 | ||
|
09d1e289de | ||
|
d65deeccb5 | ||
|
3d62a6af27 | ||
|
d268894e61 | ||
|
d89031f057 | ||
|
0c95d28e94 | ||
|
4df72e5ac6 | ||
|
a2f417e9c5 | ||
|
dc661bf144 | ||
|
7a27f494c6 | ||
|
edde6be301 | ||
|
96fdaac3ef | ||
|
e57655553f | ||
|
a1cc456f3a | ||
|
4ad961c972 | ||
|
7d9fe8e06b | ||
|
a36f98d1fc | ||
|
5befaa6886 | ||
|
726661fe8c | ||
|
b8b9f69820 | ||
|
c9a8543554 | ||
|
6136ce8d8c | ||
|
11fd012f70 | ||
|
25dc26bac6 | ||
|
10c6694087 | ||
|
c88a3e7e89 | ||
|
f7e4413d96 | ||
|
e54c5b0924 | ||
|
cbbb574e37 | ||
|
4444357563 | ||
|
55dd8f17f3 | ||
|
718e01165a | ||
|
311e858c2b | ||
|
b13bc70339 | ||
|
a90140928c | ||
|
162c60e763 | ||
|
174345cf22 | ||
|
fe9cec0787 | ||
|
1bdfe0112c | ||
|
cc69211977 | ||
|
02a57bfa8e | ||
|
0d45f2a881 | ||
|
6c46fc4228 | ||
|
1567ab0cb8 | ||
|
2554b9e774 | ||
|
b77f13b7c6 | ||
|
080442d085 | ||
|
fb82afa97f | ||
|
508be96f15 | ||
|
364575b3f0 | ||
|
c7791b63f7 | ||
|
dc48e2327b | ||
|
4ade45e67a | ||
|
46893a9749 | ||
|
6b7dfaa598 | ||
|
d0c160923d | ||
|
c2ec848744 | ||
|
187b5c6f0b | ||
|
bd8ebb00a0 | ||
|
f26ad3e32d | ||
|
4759395186 | ||
|
a2c8407dd4 | ||
|
306b3a9e8b | ||
|
4444e7c788 | ||
|
4bd5bc87ee | ||
|
528c964d94 | ||
|
3bca30121b | ||
|
53180a38ac | ||
|
d82073c3a9 | ||
|
44efff342d | ||
|
0bdb018ad4 | ||
|
b0504597da | ||
|
b85aa403cc | ||
|
ab2620147a | ||
|
09a55258a0 | ||
|
3a8d640dab | ||
|
bbc9143404 | ||
|
7be0c02ba1 | ||
|
580be37eb4 | ||
|
0e00196d8e | ||
|
a57ef5a3d5 | ||
|
325b9afca6 | ||
|
1a420828aa | ||
|
57b413ada5 | ||
|
326b787130 | ||
|
0f2824e0f4 | ||
|
7bab6eddf6 | ||
|
b7a9911ffb | ||
|
c219699024 | ||
|
dcc9868129 | ||
|
02f351001c | ||
|
6a909386b2 | ||
|
17d25ba4ce | ||
|
c7662a320f | ||
|
5a9f60d250 | ||
|
c522657212 | ||
|
2b87f10738 | ||
|
29c290e78f | ||
|
38c3ccd6be | ||
|
71cb8c378f | ||
|
94370375a5 | ||
|
afbf5f4905 | ||
|
aa0b68bc8d | ||
|
1832fb090d | ||
|
94c4f266e3 | ||
|
c96fa49853 | ||
|
a203469109 | ||
|
86d23a5de2 | ||
|
bb817d9a90 | ||
|
9117747d41 | ||
|
eaf1b86785 | ||
|
b2c83debb3 | ||
|
d82ae27231 | ||
|
7242b18ff0 | ||
|
f53a81bc18 | ||
|
7c12e2c464 | ||
|
34e0ab6100 | ||
|
390caa51db | ||
|
924815b6e1 | ||
|
9b639e09f2 | ||
|
09fdd4cb6d | ||
|
b4a44f70d9 | ||
|
c120f28d42 | ||
|
5993c647a5 | ||
|
359e9f6cbb | ||
|
d72b8b8d8e | ||
|
312ff057f8 | ||
|
9b9ca53b81 | ||
|
4ffc26a13a | ||
|
5f110f73e7 | ||
|
cab2e797eb | ||
|
ec5214f714 | ||
|
bac0e594ee | ||
|
563d40d7da | ||
|
bfd81a83cf | ||
|
833c7540a3 | ||
|
ad2cef70d2 | ||
|
541684ee2a | ||
|
ec730d2615 | ||
|
f9f398b532 | ||
|
4c61687833 | ||
|
b90001d98c | ||
|
6aad961545 | ||
|
e797276606 | ||
|
8e52ec373e | ||
|
0957cca9e2 | ||
|
2daee924c5 | ||
|
8c47b197f0 | ||
|
809df29d29 | ||
|
26bf5d350b | ||
|
6eb05cfbad | ||
|
8a69c890e7 | ||
|
9e1b05a358 | ||
|
497dccee56 | ||
|
d8e7aa54b4 | ||
|
2b163025d6 | ||
|
7b80d3932d | ||
|
c44cf42e2c | ||
|
fcf23ee8d5 | ||
|
7b2adf3b96 | ||
|
cb6405110c | ||
|
89dfad5f38 | ||
|
1e595e752a | ||
|
a6f660236f | ||
|
f260bd7efe | ||
|
823c337c1e | ||
|
f8232b9c1b | ||
|
45927f1068 | ||
|
7db2d0f697 | ||
|
a0a06973c0 | ||
|
6ba385eea6 | ||
|
70588959eb | ||
|
8c3d92c427 | ||
|
acf16fdf2e | ||
|
a1b5ef5154 | ||
|
02c2df681d | ||
|
2000727e94 | ||
|
33841d1e25 | ||
|
28ead83b04 | ||
|
247ace2f04 | ||
|
e0b6190733 | ||
|
f66a7ef7cc | ||
|
e550b15cea | ||
|
db6c8b8774 | ||
|
4982efed3a | ||
|
57d91b2d87 | ||
|
e9b3d3d313 | ||
|
6200ffef9b | ||
|
5e84490fd0 | ||
|
2b0d55632e | ||
|
f7a78d85e3 | ||
|
972411673f | ||
|
7ebf535b25 | ||
|
a661376d16 | ||
|
5a1bf08d3f | ||
|
a9b1a518a2 | ||
|
9416b1c150 | ||
|
87f67744a8 | ||
|
4add23a984 | ||
|
c52c0987fb | ||
|
60f0ef0bd5 | ||
|
82d67919bb | ||
|
713d95eb36 | ||
|
d053bb5496 | ||
|
05121b928a | ||
|
0a7e885eab | ||
|
a65488000c | ||
|
4146a4c578 | ||
|
3f2e25b35f | ||
|
2a86c25297 | ||
|
919c543cbc | ||
|
99112429f9 | ||
|
b4772e5399 | ||
|
2b47e90827 | ||
|
1c2465b2da | ||
|
a6717ee981 | ||
|
450ab61620 | ||
|
e2f01c040b | ||
|
1d15cff9ca | ||
|
88724bb4cb | ||
|
1637b90531 | ||
|
245d0d2550 | ||
|
5dd48e1b86 | ||
|
c1a8c6c190 | ||
|
c10a30bae9 | ||
|
b0bc021034 | ||
|
1b193196da | ||
|
f56fc11af9 | ||
|
ebdc232b11 | ||
|
eb0dd1f0d0 | ||
|
1aa61f1f01 | ||
|
e8153ccc79 | ||
|
55d8af44a2 | ||
|
4de5ad94f0 | ||
|
735583397c | ||
|
da94488f7b | ||
|
581d9517db | ||
|
3db724e0b3 | ||
|
71073b064a | ||
|
d82c093c0f | ||
|
c2a0cf8d04 | ||
|
1b77df12b6 | ||
|
d333d0b0e6 | ||
|
6defca5a6d | ||
|
0a2b28ebe0 | ||
|
6c64837247 | ||
|
66aaa862fd | ||
|
1ab35d89ac | ||
|
3cf19dd2ea | ||
|
01082a44ea | ||
|
aba6836bdd | ||
|
af89b23f67 | ||
|
b5620e0549 | ||
|
57eb621885 | ||
|
c2ec36b2e2 | ||
|
656cc35a0d | ||
|
b8754c7d7d | ||
|
7f2e6543ed | ||
|
cc29cf3e10 | ||
|
2831ce226c | ||
|
8fe2332f98 | ||
|
e05ccf9f62 | ||
|
83529e23de | ||
|
51ce89b61f | ||
|
ef20e29b20 | ||
|
5798c4b355 | ||
|
afc1a1bbbe | ||
|
cbf4b9c0b4 | ||
|
b88b530c7e | ||
|
c8b514106a | ||
|
634dfc69f3 | ||
|
2a83022727 | ||
|
b32496d30c | ||
|
d8c112088d | ||
|
f1ba5e7b70 | ||
|
2dd9e17568 | ||
|
13d302b650 | ||
|
9490b3dc32 | ||
|
a26f279e0f | ||
|
ef3d4ca018 | ||
|
c449ea211a | ||
|
ce824b0ccf | ||
|
34803f4b43 | ||
|
81e6b17f83 | ||
|
f949b0a28e | ||
|
66064ca9be | ||
|
f9fc78a10d | ||
|
e195ca27a8 | ||
|
61624d1533 | ||
|
d31690e7f5 | ||
|
2bed1d8038 | ||
|
0ce6a1ea9a | ||
|
4bcfc5078c | ||
|
8a7fd66919 | ||
|
ac0e98e721 | ||
|
5a1948c4fc | ||
|
9ff1a42396 | ||
|
3130e3de5e | ||
|
da20d75e3c | ||
|
7a0df21c5a | ||
|
7d4d3d977b | ||
|
408bb38cc0 | ||
|
b7cb1e8d36 | ||
|
42dabea81f | ||
|
a077ae9ca3 | ||
|
17e9bccc15 | ||
|
4a5b84d2e7 | ||
|
557fc2cd39 | ||
|
e92c267cde | ||
|
f959a69530 | ||
|
4e246779f4 | ||
|
5b0f5aeaa0 | ||
|
6e92af8b00 | ||
|
1cf9491fe6 | ||
|
3fcc7bd3b9 | ||
|
4acff91f80 | ||
|
a0152ffb18 | ||
|
d1e38558c5 | ||
|
0cca808275 | ||
|
5ee5f82e3d | ||
|
9077fef5b2 | ||
|
93cebec0be | ||
|
a4a81c0ec2 | ||
|
50dcfdb2a6 | ||
|
8149397850 | ||
|
1ced907e52 | ||
|
17c5a40740 | ||
|
440bed81b8 | ||
|
eeb8fe1443 | ||
|
11b1ab5932 | ||
|
6f34c43dc1 | ||
|
8ced9eef45 | ||
|
8af52153e4 | ||
|
2c5e5f13dd | ||
|
1bbfea4aa3 | ||
|
16f3ae9d1e | ||
|
a976a2118a | ||
|
9cecbe407f | ||
|
b3de5157fe | ||
|
188dc98c4a | ||
|
bcc4545ce7 | ||
|
9ee3cd6a18 | ||
|
a5182a1454 | ||
|
be7581c432 | ||
|
e855c49824 | ||
|
e010cbc319 | ||
|
70f0c5b728 | ||
|
1a34b85250 | ||
|
1b8c77d034 | ||
|
07b1a974cf | ||
|
54319c0466 | ||
|
9040e62c0e | ||
|
763bd7d244 | ||
|
9b76c8f611 | ||
|
fede3f9fc7 | ||
|
9eb74fdc8a | ||
|
05dda5b083 | ||
|
d1e987a240 | ||
|
8ffeac4315 | ||
|
dd3c203827 | ||
|
fc06c76e2c | ||
|
13d341e014 | ||
|
1d5d0688aa | ||
|
1a19856c0c | ||
|
0236e1529e | ||
|
947613a7e2 | ||
|
88df26d722 | ||
|
7bceda976b | ||
|
e3f506817b | ||
|
422525a9bb | ||
|
c3a684c7ed | ||
|
3537f76eab | ||
|
c37c4f46da | ||
|
42eacd616c | ||
|
875f8eb530 | ||
|
9dca657edf | ||
|
d7648102a9 | ||
|
bba6485eff | ||
|
2075c7319f | ||
|
92e1d0843c | ||
|
4e0fdb4c77 | ||
|
9a26b2bef4 | ||
|
d64750b3eb | ||
|
06f63a2087 | ||
|
b2d053f686 | ||
|
765bd59965 | ||
|
6ecca9565a | ||
|
a28009f24b | ||
|
7f596db09b | ||
|
dd8323ee36 | ||
|
104a31ba30 | ||
|
b0a26eb78c | ||
|
f9e8424620 | ||
|
9bfb7f978d | ||
|
d4e3254395 | ||
|
ceb567779e | ||
|
2e0d494bec | ||
|
6d9bb709c7 | ||
|
915351baec | ||
|
707889abc8 | ||
|
2cd1c2964a | ||
|
8a451e0bfc | ||
|
0b9ad5425c | ||
|
da5db714c2 | ||
|
d4a2357a32 | ||
|
588a9f952f | ||
|
66233ce818 | ||
|
7d4bd8a845 | ||
|
3a6b8847f1 | ||
|
2ffec2ee71 | ||
|
7eea2476ca | ||
|
9711af42ae | ||
|
d12d52918b | ||
|
ad92d11cf9 | ||
|
3ca035f9aa | ||
|
bbff3a2748 | ||
|
f5cd5f202f | ||
|
a78cbf644c | ||
|
2de47a8656 | ||
|
b45519974a | ||
|
edaf45d133 | ||
|
6b9e991082 | ||
|
8a431dc3cc | ||
|
91b1d9029e | ||
|
e337c10bb8 | ||
|
e0258d2708 | ||
|
fcb5778705 | ||
|
40b47de9e1 | ||
|
deadd67691 | ||
|
c119731e65 | ||
|
2b7e7f3ff4 | ||
|
f4acb2c5db | ||
|
f9779284e4 |
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -11,5 +11,8 @@ phpunit.xml export-ignore
|
|||||||
tests export-ignore
|
tests export-ignore
|
||||||
|
|
||||||
js/dist/* -diff
|
js/dist/* -diff
|
||||||
|
js/dist/* linguist-generated
|
||||||
|
js/dist-typings/* linguist-generated
|
||||||
|
js/yarn.lock -diff
|
||||||
|
|
||||||
* text=auto eol=lf
|
* text=auto eol=lf
|
||||||
|
3
.github/FUNDING.yml
vendored
3
.github/FUNDING.yml
vendored
@@ -1,3 +0,0 @@
|
|||||||
github: flarum
|
|
||||||
open_collective: flarum
|
|
||||||
tidelift: packagist/flarum/core
|
|
24
.github/PULL_REQUEST_TEMPLATE.md
vendored
24
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,24 +0,0 @@
|
|||||||
<!--
|
|
||||||
IMPORTANT: We applaud pull requests, they excite us every single time. As we have an obligation to maintain a healthy code standard and quality, we take sufficient time for reviews. Please do create a separate pull request per change/issue/feature; we will ask you to split bundled pull requests.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Fixes #0000**
|
|
||||||
|
|
||||||
**Changes proposed in this pull request:**
|
|
||||||
<!-- fill this out, mention the pages and/or components which have been impacted -->
|
|
||||||
|
|
||||||
**Reviewers should focus on:**
|
|
||||||
<!-- fill this out, ask for feedback on specific changes you are unsure about -->
|
|
||||||
|
|
||||||
**Screenshot**
|
|
||||||
<!-- include an image of the most relevant user-facing change, if any -->
|
|
||||||
|
|
||||||
**Confirmed**
|
|
||||||
|
|
||||||
- [ ] Frontend changes: tested on a local Flarum installation.
|
|
||||||
- [ ] Backend changes: tests are green (run `composer test`).
|
|
||||||
|
|
||||||
**Required changes:**
|
|
||||||
|
|
||||||
- [ ] Related documentation PR: (Remove if irrelevant)
|
|
||||||
- [ ] Related core extension PRs: (Remove if irrelevant)
|
|
13
.github/SECURITY.md
vendored
13
.github/SECURITY.md
vendored
@@ -1,13 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Supported Versions
|
|
||||||
|
|
||||||
During the beta phase, we will only patch security vulnerabilities in the latest beta release.
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
If you discover a security vulnerability within Flarum, please send an email to security@flarum.org so we can address it promptly.
|
|
||||||
|
|
||||||
We will get back to you as time allows.
|
|
||||||
Discussions may commence internally, so you may not hear back immediately.
|
|
||||||
When reporting a vulnerability, please provide your GitHub username (if available), so that we can invite you to collaborate on a [security advisory on GitHub](https://help.github.com/en/articles/about-maintainer-security-advisories).
|
|
15
.github/workflows/backend.yml
vendored
Normal file
15
.github/workflows/backend.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: Core PHP
|
||||||
|
|
||||||
|
on: [workflow_dispatch, push, pull_request]
|
||||||
|
|
||||||
|
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||||
|
# This will break your current script.
|
||||||
|
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
run:
|
||||||
|
uses: flarum/.github/.github/workflows/REUSABLE_backend.yml@main
|
||||||
|
with:
|
||||||
|
enable_backend_testing: true
|
||||||
|
|
||||||
|
backend_directory: .
|
30
.github/workflows/build.yml
vendored
30
.github/workflows/build.yml
vendored
@@ -1,30 +0,0 @@
|
|||||||
name: JavaScript
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: JS / Build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Restore npm cache
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: ~/.npm
|
|
||||||
key: ${{ runner.os }}-node-${{ hashFiles('js/package-lock.json') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-node-
|
|
||||||
|
|
||||||
# Our action will install npm, cd into `./js`, run `npm run build`,
|
|
||||||
# then commit and upload any changes
|
|
||||||
- name: Build production JS
|
|
||||||
uses: flarum/action-build@master
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
21
.github/workflows/frontend.yml
vendored
Normal file
21
.github/workflows/frontend.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
name: Core JS
|
||||||
|
|
||||||
|
on: [workflow_dispatch, push, pull_request]
|
||||||
|
|
||||||
|
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||||
|
# This will break your current script.
|
||||||
|
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
run:
|
||||||
|
uses: flarum/.github/.github/workflows/REUSABLE_frontend.yml@main
|
||||||
|
with:
|
||||||
|
enable_bundlewatch: true
|
||||||
|
enable_prettier: true
|
||||||
|
enable_typescript: true
|
||||||
|
|
||||||
|
frontend_directory: ./js
|
||||||
|
main_git_branch: master
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
bundlewatch_github_token: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}
|
28
.github/workflows/lint.yml
vendored
28
.github/workflows/lint.yml
vendored
@@ -1,28 +0,0 @@
|
|||||||
name: Lint
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- 'js/src/**'
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'js/src/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
prettier:
|
|
||||||
name: JS / Prettier
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v2
|
|
||||||
with:
|
|
||||||
node-version: "14"
|
|
||||||
|
|
||||||
- name: Check JS formatting
|
|
||||||
run: npx prettier --check src
|
|
||||||
working-directory: ./js
|
|
45
.github/workflows/pr_size_change.yml
vendored
45
.github/workflows/pr_size_change.yml
vendored
@@ -1,45 +0,0 @@
|
|||||||
name: Bundle size checker
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- "js/**"
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "js/**"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
bundlewatch:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
name: Bundlewatch
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v2
|
|
||||||
with:
|
|
||||||
node-version: "14"
|
|
||||||
|
|
||||||
- name: Use npm v7
|
|
||||||
run: sudo npm install -g npm@7.x.x
|
|
||||||
|
|
||||||
- name: Install JS dependencies
|
|
||||||
# We need to use `npm install` here. If we don't, the workflow will fail.
|
|
||||||
run: npm install
|
|
||||||
working-directory: ./js
|
|
||||||
|
|
||||||
- name: Build production assets
|
|
||||||
run: npm run build
|
|
||||||
working-directory: ./js
|
|
||||||
|
|
||||||
- name: Check bundle size change
|
|
||||||
run: node_modules/.bin/bundlewatch --config .bundlewatch.config.json
|
|
||||||
working-directory: ./js
|
|
||||||
env:
|
|
||||||
BUNDLEWATCH_GITHUB_TOKEN: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}
|
|
||||||
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
|
79
.github/workflows/test.yml
vendored
79
.github/workflows/test.yml
vendored
@@ -1,79 +0,0 @@
|
|||||||
name: Tests
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
php: [7.3, 7.4, '8.0']
|
|
||||||
service: ['mysql:5.7', mariadb]
|
|
||||||
prefix: ['', flarum_]
|
|
||||||
|
|
||||||
include:
|
|
||||||
- service: 'mysql:5.7'
|
|
||||||
db: MySQL
|
|
||||||
- service: mariadb
|
|
||||||
db: MariaDB
|
|
||||||
- prefix: flarum_
|
|
||||||
prefixStr: (prefix)
|
|
||||||
|
|
||||||
exclude:
|
|
||||||
- php: 7.3
|
|
||||||
service: 'mysql:5.7'
|
|
||||||
prefix: flarum_
|
|
||||||
- php: 7.3
|
|
||||||
service: mariadb
|
|
||||||
prefix: flarum_
|
|
||||||
- php: 8.0
|
|
||||||
service: 'mysql:5.7'
|
|
||||||
prefix: flarum_
|
|
||||||
- php: 8.0
|
|
||||||
service: mariadb
|
|
||||||
prefix: flarum_
|
|
||||||
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: ${{ matrix.service }}
|
|
||||||
ports:
|
|
||||||
- 13306:3306
|
|
||||||
|
|
||||||
name: 'PHP ${{ matrix.php }} / ${{ matrix.db }} ${{ matrix.prefixStr }}'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup PHP
|
|
||||||
uses: shivammathur/setup-php@0b9d33cd0782337377999751fc10ea079fdd7104 # pin@v2
|
|
||||||
with:
|
|
||||||
php-version: ${{ matrix.php }}
|
|
||||||
coverage: xdebug
|
|
||||||
extensions: curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip
|
|
||||||
tools: phpunit, composer:v2
|
|
||||||
|
|
||||||
# The authentication alter is necessary because newer mysql versions use the `caching_sha2_password` driver,
|
|
||||||
# which isn't supported prior to PHP7.4
|
|
||||||
# When we drop support for PHP7.3, we should remove this from the setup.
|
|
||||||
- name: Create MySQL Database
|
|
||||||
run: |
|
|
||||||
sudo systemctl start mysql
|
|
||||||
mysql -uroot -proot -e 'CREATE DATABASE flarum_test;' --port 13306
|
|
||||||
mysql -uroot -proot -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';" --port 13306
|
|
||||||
|
|
||||||
- name: Install Composer dependencies
|
|
||||||
run: composer install
|
|
||||||
|
|
||||||
- name: Setup Composer tests
|
|
||||||
run: composer test:setup
|
|
||||||
env:
|
|
||||||
DB_PORT: 13306
|
|
||||||
DB_PASSWORD: root
|
|
||||||
DB_PREFIX: ${{ matrix.prefix }}
|
|
||||||
|
|
||||||
- name: Run Composer tests
|
|
||||||
run: composer test
|
|
||||||
env:
|
|
||||||
COMPOSER_PROCESS_TIMEOUT: 600
|
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,7 +1,7 @@
|
|||||||
/vendor
|
/vendor
|
||||||
composer.lock
|
composer.lock
|
||||||
composer.phar
|
composer.phar
|
||||||
node_modules
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
tests/.phpunit.result.cache
|
tests/.phpunit.result.cache
|
||||||
@@ -9,3 +9,4 @@ tests/.phpunit.result.cache
|
|||||||
.vagrant
|
.vagrant
|
||||||
.idea/*
|
.idea/*
|
||||||
.vscode
|
.vscode
|
||||||
|
js/coverage-ts
|
||||||
|
266
CHANGELOG.md
266
CHANGELOG.md
@@ -1,5 +1,271 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [1.2.1](https://github.com/flarum/core/compare/v1.2.0...v1.2.1)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Don't escape single quotes in discussion title meta tags (60600f4d2b8f0c5dac94c329041427a0a08fad42)
|
||||||
|
|
||||||
|
## [1.2.0](https://github.com/flarum/core/compare/v1.1.1...v1.2.0)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- View `README` documentation in extension pages (https://github.com/flarum/core/pull/3094).
|
||||||
|
- Declare & Use CSS Custom Properties (https://github.com/flarum/core/pull/3146).
|
||||||
|
- Lazy draw dropdowns to improve performance (https://github.com/flarum/core/pull/2925).
|
||||||
|
- Default Settings Extender (https://github.com/flarum/core/pull/3127).
|
||||||
|
- Add `textarea` setting type to admin pages (https://github.com/flarum/core/pull/3141).
|
||||||
|
- Allow registering settings as `Less` config vars through Settings Extender (https://github.com/flarum/core/pull/3011).
|
||||||
|
- Allow replacing of blade template namespaces via extender (https://github.com/flarum/core/pull/3167).
|
||||||
|
- Update to Webpack 5 (https://github.com/flarum/core/pull/3135).
|
||||||
|
- Introduce `Less` custom function extender with a `is-extension-enabled` function (https://github.com/flarum/core/pull/3190).
|
||||||
|
- Support for `few` in ICU Message syntax (https://github.com/flarum/core/pull/3122).
|
||||||
|
- ES6 local support for number formatting (https://github.com/flarum/core/pull/3099).
|
||||||
|
- Added dedicated endpoint for retrieving single groups (https://github.com/flarum/core/pull/3084).
|
||||||
|
- Callback `loadWhere` relation eager loading extender (https://github.com/flarum/core/pull/3116).
|
||||||
|
- Extensible document title driver implementation (https://github.com/flarum/core/pull/3109).
|
||||||
|
- Type checks, typescript coverage GH action (https://github.com/flarum/core/pull/3136).
|
||||||
|
- Add color indicator in appearance admin page instead of validating colors (https://github.com/flarum/core/pull/3140).
|
||||||
|
- Add typing files for our translator libraries (https://github.com/flarum/core/pull/3175).
|
||||||
|
- `StatusWidget` tools extensibility (https://github.com/flarum/core/pull/3189).
|
||||||
|
- Allow switching the `ImageManager` driver (https://github.com/flarum/core/pull/3195).
|
||||||
|
- Events for notification read/all read actions (https://github.com/flarum/core/pull/3203).
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Testing with php8.1 (https://github.com/flarum/core/pull/3102).
|
||||||
|
- Migrate fully to Yarn (https://github.com/flarum/core/pull/3155).
|
||||||
|
- Handle post rendering errors to avoid crashes (https://github.com/flarum/core/pull/3061).
|
||||||
|
- Added basic filtering, sorting, and pagination to groups endpoint (https://github.com/flarum/core/pull/3084).
|
||||||
|
- Pass IP address to API Client pipeline (https://github.com/flarum/core/pull/3124).
|
||||||
|
- Rename Extension Page "Uninstall" to "Purge" (https://github.com/flarum/core/pull/3123).
|
||||||
|
- [A11Y] Improve accessibility for discussion reply count on post stream (https://github.com/flarum/core/pull/3090).
|
||||||
|
- Improved post loading support (https://github.com/flarum/core/pull/3100).
|
||||||
|
- Rewrite SubtreeRetainer into Typescript (https://github.com/flarum/core/pull/3137).
|
||||||
|
- Rewrite ModalManager and state to Typescript (https://github.com/flarum/core/pull/3007).
|
||||||
|
- Rewrite frontend application files to Typescript (https://github.com/flarum/core/pull/3006).
|
||||||
|
- Allow extensions to modify the minimum search length in the Search component (https://github.com/flarum/core/pull/3130).
|
||||||
|
- Allow use of any tag in `listItems` helper (https://github.com/flarum/core/pull/3147).
|
||||||
|
- Replace `for ... in` with `Array.reduce` (https://github.com/flarum/core/pull/3149).
|
||||||
|
- Page title format is now implemented through translations (https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228)
|
||||||
|
- Add `aria-label` attribute to the navigation drawer button (https://github.com/flarum/core/pull/3157).
|
||||||
|
- Convert extend util to TypeScript (https://github.com/flarum/core/pull/2928).
|
||||||
|
- Better typings for DiscussionListState (https://github.com/flarum/core/pull/3132).
|
||||||
|
- Rewrite ItemList, update `ItemList` typings (https://github.com/flarum/core/pull/3005).
|
||||||
|
- Add priority order to discussion page controls (https://github.com/flarum/core/pull/3165).
|
||||||
|
- Use `@php` in Blade templates (https://github.com/flarum/core/pull/3172).
|
||||||
|
- Convert some common classes/utils to TS (https://github.com/flarum/core/pull/2929).
|
||||||
|
- Convert routes to Typescript (https://github.com/flarum/core/pull/3177).
|
||||||
|
- Move admin `colorItems` to an `ItemList` (https://github.com/flarum/core/pull/3186).
|
||||||
|
- Centralize pagination/canonical meta URL generation in Document (https://github.com/flarum/core/pull/3077).
|
||||||
|
- Use revision versioner to allow custom asset versioning (https://github.com/flarum/core/pull/3183).
|
||||||
|
- Split up application error handling (https://github.com/flarum/core/pull/3184).
|
||||||
|
- Make SlugManager available to blade template (https://github.com/flarum/core/pull/3194).
|
||||||
|
- Convert models to TS (https://github.com/flarum/core/pull/3174).
|
||||||
|
- Allow loading relations in other discussion endpoints (https://github.com/flarum/core/pull/3191).
|
||||||
|
- Improve selected text stylization (https://github.com/flarum/core/pull/2961).
|
||||||
|
- Extract notification `primaryControl` items to an ItemList (https://github.com/flarum/core/pull/3204).
|
||||||
|
- Frontend code housekeeping (#3214, #3213).
|
||||||
|
- Only retain scroll position if coming from discussion (https://github.com/flarum/core/pull/3229).
|
||||||
|
- Use `aria-live` regions to focus screenreader attention on alerts as they appear (https://github.com/flarum/core/pull/3237).
|
||||||
|
- Prevent unwarranted `a11y` warnings on custom Button subclasses (https://github.com/flarum/core/pull/3238).
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Missing locale text in the user editing modal (https://github.com/flarum/core/pull/3093).
|
||||||
|
- Dashes in table prefix prevent installation (https://github.com/flarum/core/pull/3089).
|
||||||
|
- Missing autocomplete attributes to input fields (https://github.com/flarum/core/pull/3088).
|
||||||
|
- Missing route parameters throwing an error (https://github.com/flarum/core/pull/3118).
|
||||||
|
- Mail settings select component never used (https://github.com/flarum/core/pull/3120).
|
||||||
|
- White avatar image throws javascript errors on the profile page (https://github.com/flarum/core/pull/3119).
|
||||||
|
- Unformatted avatar upload validation errors (https://github.com/flarum/core/pull/2946).
|
||||||
|
- Webkit input clear button shows up with the custom one (https://github.com/flarum/core/pull/3128).
|
||||||
|
- Media query breakpoints conflict with Windows display scaling (https://github.com/flarum/core/pull/3139).
|
||||||
|
- `typeof this` not recognized by some IDEs (https://github.com/flarum/core/pull/3142).
|
||||||
|
- `Model.save()` cannot save `null` `hasOne` relationship (https://github.com/flarum/core/pull/3131).
|
||||||
|
- Edit post `until reply` policy broken on PHP 8 (https://github.com/flarum/core/pull/3145).
|
||||||
|
- Inaccurate `Component.component` argument typings (https://github.com/flarum/core/pull/3148).
|
||||||
|
- Scrolling notification list infinitely repeats (https://github.com/flarum/core/pull/3159).
|
||||||
|
- Argument for INFO constant was assigned to `maxfiles` argument incorrectly (bfd81a83cfd0fa8125395a147ff0c9ce622f38e3).
|
||||||
|
- `Activated` event is sent every time an email is confirmed instead of just once (https://github.com/flarum/core/pull/3163).
|
||||||
|
- [A11Y] Modal close button missing accessible label (https://github.com/flarum/core/pull/3161).
|
||||||
|
- [A11Y] Auth modal inputs missing accessible labels (https://github.com/flarum/core/pull/3207).
|
||||||
|
- [A11Y] Triggering click on drawer button can cause layered backdrops (https://github.com/flarum/core/pull/3018).
|
||||||
|
- [A11Y] Focus can leave open nav drawer on mobile (https://github.com/flarum/core/pull/3018).
|
||||||
|
- [A11Y] Post action items not showing when focus is within the post (https://github.com/flarum/core/pull/3173).
|
||||||
|
- [A11Y] Missing accessible label for alert dismiss button (https://github.com/flarum/core/pull/3237).
|
||||||
|
- Error accessing the forum after saving a setting with more than 65k characters (https://github.com/flarum/core/pull/3162).
|
||||||
|
- Cannot restart queue from within (https://github.com/flarum/core/pull/3166).
|
||||||
|
- `Post--by-actor` not showing when comparing user instances (https://github.com/flarum/core/pull/3170).
|
||||||
|
- Incorrect typings for Modal `hide()` method (https://github.com/flarum/core/pull/3180).
|
||||||
|
- Avatar Upload throws errors with correct mimetype and incorrect extension (https://github.com/flarum/core/pull/3181).
|
||||||
|
- Clicking the dropdown button on a post opens all dropdowns in `Post-actions` (https://github.com/flarum/core/pull/3185).
|
||||||
|
- `getPlainContent()` causes external content to be fetched (https://github.com/flarum/core/pull/3193).
|
||||||
|
- `listItems` not accepting all `Mithril.Children` (https://github.com/flarum/core/pull/3176).
|
||||||
|
- Notifications mark as read option updates all notifications including the read ones (https://github.com/flarum/core/pull/3202).
|
||||||
|
- Post meta permalink not properly generated (https://github.com/flarum/core/pull/3216).
|
||||||
|
- Broken contribution link in README (https://github.com/flarum/core/pull/3211).
|
||||||
|
- `WelcomeHero` is displayed when content is empty (https://github.com/flarum/core/pull/3219).
|
||||||
|
- `last_activity_at, last_seen_at` updated on all API requests (https://github.com/flarum/core/pull/3231).
|
||||||
|
- `RememberMe` access token updated twice in API requests (https://github.com/flarum/core/pull/3233).
|
||||||
|
- Error in `funding` item in `composer.json` bricks the frontend (https://github.com/flarum/core/pull/3239).
|
||||||
|
- Escaped quotes in window title (https://github.com/flarum/core/pull/3264)
|
||||||
|
- `schedule:list` command fails due to missing timezone configuration.
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
- Unused `evented` utility (https://github.com/flarum/core/pull/3125).
|
||||||
|
|
||||||
|
## [1.1.1](https://github.com/flarum/core/compare/v1.1.0...v1.1.1)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Performance issue with very large communities.
|
||||||
|
|
||||||
|
## [1.1.0](https://github.com/flarum/core/compare/v1.0.4...v1.1.0)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Info command now displays MySQL version, queue driver, mail driver (https://github.com/flarum/core/pull/2991)
|
||||||
|
- Use organization Prettier config (https://github.com/flarum/core/pull/2967)
|
||||||
|
- Support for global typings in extensions (https://github.com/flarum/core/pull/2992)
|
||||||
|
- Typings for class component state attribute (https://github.com/flarum/core/pull/2995)
|
||||||
|
- Custom colorising with CSS custom properties (https://github.com/flarum/core/pull/3001)
|
||||||
|
- Theme Extender to allow overriding LESS files (https://github.com/flarum/core/pull/3008)
|
||||||
|
- Update lastSeenAt when authenticating via API (https://github.com/flarum/core/pull/3058)
|
||||||
|
- NoJs Admin View (https://github.com/flarum/core/pull/3059)
|
||||||
|
- Preload FontAwesome, JS and CSS, and add `preload` extender (https://github.com/flarum/core/pull/3057)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Move Day.js plugin types import to global typings (https://github.com/flarum/core/pull/2954)
|
||||||
|
- Avoid resolving excluded middleware on each middleware items
|
||||||
|
- Allow extra attrs provided to `<Select>` to be passed through to the DOM element (https://github.com/flarum/core/pull/2959)
|
||||||
|
- Limit height of code blocks (https://github.com/flarum/core/pull/3012)
|
||||||
|
- Update normalize.css from v3.0.2 to v8.0.1 (https://github.com/flarum/core/pull/3015)
|
||||||
|
- Permission Grid: stick the headers to handle a lot of tags (https://github.com/flarum/core/pull/2887)
|
||||||
|
- Use `ItemList` for `DiscussionPage` content (https://github.com/flarum/core/pull/3004)
|
||||||
|
- Move email confirmation to POST request (https://github.com/flarum/core/pull/3038)
|
||||||
|
- Minor CSS code cleanup (https://github.com/flarum/core/pull/3026)
|
||||||
|
- Replace username with display name in more places (https://github.com/flarum/core/pull/3040)
|
||||||
|
- Rewrite Button to Typescript (https://github.com/flarum/core/pull/2984)
|
||||||
|
- Rewrite AdminPage abstract component into Typescript (https://github.com/flarum/core/pull/2996)
|
||||||
|
- Allow adding page parameters to PaginatedListState (https://github.com/flarum/core/pull/2935)
|
||||||
|
- Pass filter params to getApiDocument (https://github.com/flarum/core/pull/3037)
|
||||||
|
- Use author filter instead of gambit to get a user's discussions (https://github.com/flarum/core/pull/3068)
|
||||||
|
- [A11Y] Accessibility improvements for the Search component (https://github.com/flarum/core/pull/3017)
|
||||||
|
- Add determinsm to extension order resolution (https://github.com/flarum/core/pull/3076)
|
||||||
|
- Add cache control headers to the admin area (https://github.com/flarum/core/pull/3097)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- HLJS 11 new styles resulting in double padding (https://github.com/flarum/core/pull/2909)
|
||||||
|
- Internal API client attempting to load an uninstantiated session
|
||||||
|
- Empty post footer taking visual space (https://github.com/flarum/core/pull/2926)
|
||||||
|
- Unrecognized component class custom attribute typings (https://github.com/flarum/core/pull/2962)
|
||||||
|
- User edit groups permission not visually depending on view hidden groups permission (https://github.com/flarum/core/pull/2880)
|
||||||
|
- Event post excerpt preview triggers error (https://github.com/flarum/core/pull/2964)
|
||||||
|
- Missing settings defaults for display name driver and User slug driver (https://github.com/flarum/core/pull/2971)
|
||||||
|
- [A11Y] Icons not hidden from screenreaders (https://github.com/flarum/core/pull/3027)
|
||||||
|
- [A11Y] Checkboxes not focusable (https://github.com/flarum/core/pull/3014)
|
||||||
|
- Uploading ICO favicons resulting in server errors (https://github.com/flarum/core/pull/2949)
|
||||||
|
- Missing proper validation for large avatar upload payload (https://github.com/flarum/core/pull/3042)
|
||||||
|
- [A11Y] Missing focus rings in control elements (https://github.com/flarum/core/pull/3016)
|
||||||
|
- Unsanitised integer query parameters (https://github.com/flarum/core/pull/3064)
|
||||||
|
|
||||||
|
###### Code Contributors
|
||||||
|
@lhsazevedo, @Ornanovitch, @pierres, @the-turk, @iPurpl3x
|
||||||
|
|
||||||
|
###### Issue Reporters
|
||||||
|
@uamv, @dannyuk1982, @BurnNoticeSpy, @haarp, @peopleinside, @matteocontrini
|
||||||
|
|
||||||
|
## [1.0.4](https://github.com/flarum/core/compare/v1.0.3...v1.0.4)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Upgrade to v1.0 resets the "view" permission on all tags (https://github.com/flarum/core/pull/2941)
|
||||||
|
|
||||||
|
## [1.0.3](https://github.com/flarum/core/compare/v1.0.2...v1.0.3)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Removed [forum] prefix from Request Password and Email Confirmation emails ([a4a81c0](https://github.com/flarum/core/commit/a4a81c0ec237476cd6e7ca00c1ed9465493af476))
|
||||||
|
- Adopt huntr.dev for handling our security vulnerability reports (https://github.com/flarum/core/pull/2918)
|
||||||
|
- Maintenance handler can now be replaced through the service container (ioc) ([4acff91](https://github.com/flarum/core/commit/4acff91f8063fcced9bf8c9a76fbb510d06823c0))
|
||||||
|
- The colors on the auto generated avatars are now based on the Display Name of the user (https://github.com/flarum/core/pull/2873)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Avatar in notifications list are incorrectly aligned (https://github.com/flarum/core/pull/2906)
|
||||||
|
- FilesystemManager is not compatible with upstream Laravel implementation (https://github.com/flarum/core/pull/2936)
|
||||||
|
|
||||||
|
## [1.0.2](https://github.com/flarum/core/compare/v1.0.1...v1.0.2)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Critical XSS vulnerability
|
||||||
|
|
||||||
|
## [1.0.1](https://github.com/flarum/core/compare/v1.0.0...v1.0.1)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Installation fails on environments without proc_* functions enabled or mysql client binary (https://github.com/flarum/core/issues/2890)
|
||||||
|
|
||||||
|
## [1.0.0](https://github.com/flarum/core/compare/v0.1.0-beta.16...v1.0.0)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Task scheduling
|
||||||
|
- `load()` method on `ApiController` extender to allow eager loading of relations (https://github.com/flarum/core/pull/2724)
|
||||||
|
- Installation supports enabling a set of extensions (https://github.com/flarum/core/pull/2757)
|
||||||
|
- RequestUtil helper class added to abstract the logic of the actor, session, locale and route name from the request (https://github.com/flarum/core/pull/2449)
|
||||||
|
- Code scanning action with GitHub CodeQL (https://github.com/flarum/core/pull/2744)
|
||||||
|
- The Formatter extender now has an `unparse` method to allow extensions to hook into the unparsing of content (https://github.com/flarum/core/pull/2780)
|
||||||
|
- A Filesystem extender allows direct modification and addition of filesystem disks (https://github.com/flarum/core/pull/2732)
|
||||||
|
- A slug driver based on the User ID was introduced (https://github.com/flarum/core/pull/2787)
|
||||||
|
- An extensible users list was added to the admin area (https://github.com/flarum/core/pull/2626)
|
||||||
|
- Headers hardened by adding Referer Policy, Xss Protection and Content type (https://github.com/flarum/core/pull/2721)
|
||||||
|
- Tooltip component (https://github.com/flarum/core/pull/2843)
|
||||||
|
- Moved `insertText` and `styleSelectedText` from markdown to core (https://github.com/flarum/core/pull/2826)
|
||||||
|
- A squashed database schema install dump to speed up new installs (https://github.com/flarum/core/pull/2842)
|
||||||
|
- Pagination in the canonical URL for discussion pages (https://github.com/flarum/core/pull/2853)
|
||||||
|
- PaginatedListState for the DiscussionList and to support paginated lists in the frontend (https://github.com/flarum/core/pull/2781)
|
||||||
|
- Introduce the new webpack config and flarum-tsconfig for typehinting (https://github.com/flarum/core/pull/2856)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Now tracking bundle sizes to keep an eye on web performance (https://github.com/flarum/core/pull/2695)
|
||||||
|
- Eager load relations on ListPostsController to improve performance (https://github.com/flarum/core/pull/2717)
|
||||||
|
- Replace classList with clsx library (https://github.com/flarum/core/pull/2760)
|
||||||
|
- Replaced the javascript based loading spinner with a pure CSS version (https://github.com/flarum/core/pull/2764)
|
||||||
|
- Route names now have to be unique (https://github.com/flarum/core/pull/2771)
|
||||||
|
- ActorReference is now available from the error handler middleware (https://github.com/flarum/core/pull/2410)
|
||||||
|
- The `migrations` table now has an Auto Increment ID (https://github.com/flarum/core/pull/2794)
|
||||||
|
- Assets and avatars are now managed using Laravel filesystem disks (https://github.com/flarum/core/pull/2729)
|
||||||
|
- Extracted asset publishing (`php flarum assets:publish`) from migrating (https://github.com/flarum/core/pull/2731)
|
||||||
|
- Assets were compiled in the format `<asset>-<revision>.<js|css>`, this is now `<asset>.<js|css>?v=<revision>` (https://github.com/flarum/core/pull/2805)
|
||||||
|
- The powered by header can now be configured in the config under `headers` (https://github.com/flarum/core/pull/2777)
|
||||||
|
- Switched to the ICU format for translation files (https://github.com/flarum/core/pull/2759)
|
||||||
|
- Allow extend and override to apply to multiple methods in one call
|
||||||
|
- Notifications dropdown and list refactored (https://github.com/flarum/core/pull/2822)
|
||||||
|
- Updated validation locale strings based on Laravel 8 changes (https://github.com/flarum/core/pull/2829)
|
||||||
|
- Caching of permissions is now taken care of centrally, reducing code duplication (https://github.com/flarum/core/pull/2832)
|
||||||
|
- Replaced lodash-es by throttle-debounce to reduce bundle size (https://github.com/flarum/core/pull/2827)
|
||||||
|
- Internal API requests are now executed through middleware (https://github.com/flarum/core/pull/2783)
|
||||||
|
- Permission changes: `viewDiscussions` to `viewForum` and `viewUserList` to `searchUsers` (https://github.com/flarum/core/pull/2854)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- Javascript is shown when editing the title of a discussion (https://github.com/flarum/core/pull/2693)
|
||||||
|
- Canonical url logic uses request object which causes wrong URL's when a different page is default (https://github.com/flarum/core/pull/2674)
|
||||||
|
- Dropdown toggle has no aria label (https://github.com/flarum/core/pull/2668)
|
||||||
|
- Nav drawer is focusable when off-screen on small viewports (https://github.com/flarum/core/pull/2666)
|
||||||
|
- Search input has no aria-label and no role (https://github.com/flarum/core/pull/2669)
|
||||||
|
- Code duplication exists between SendConfirmationEmailController and AccountActivationMailer (https://github.com/flarum/core/pull/2493)
|
||||||
|
- When setting tags as homepage default, visiting a tag will show all posts (https://github.com/flarum/core/pull/2754)
|
||||||
|
- Locale cache is cleared twice when cache clearing (https://github.com/flarum/core/pull/2738)
|
||||||
|
- When cache clearing fails an exception can be thrown due to a partial flush (https://github.com/flarum/core/pull/2756)
|
||||||
|
- Database migrations rely on MyISAM even though the eventual migrated database does not use it (https://github.com/flarum/core/pull/2442)
|
||||||
|
- Discussion search result is not sorted by relevance by default (https://github.com/flarum/core/pull/2773)
|
||||||
|
- Extensions cannot register custom searcher classes (https://github.com/flarum/core/pull/2755)
|
||||||
|
- Searching discussion titles is not possible (https://github.com/flarum/core/pull/2698)
|
||||||
|
- Boot errors due to failing extenders throw a generic error (https://github.com/flarum/core/pull/2740)
|
||||||
|
- Required argument to `Component.$()` isn't really required (https://github.com/flarum/core/pull/2844)
|
||||||
|
- Component does not allows use of all mithril lifecycle functionality (https://github.com/flarum/core/pull/2847)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- The `make:migration` command has been removed (https://github.com/flarum/core/pull/2686)
|
||||||
|
- Background fade on the header has been removed (https://github.com/flarum/core/pull/2685)
|
||||||
|
- Remove vendor prefixes in less (https://github.com/flarum/core/pull/2766)
|
||||||
|
- The session is no longer available from the User class (https://github.com/flarum/core/pull/2790)
|
||||||
|
- The `mail` key is removed from the laravel related config (https://github.com/flarum/core/pull/2796)
|
||||||
|
|
||||||
## [0.1.0-beta.16](https://github.com/flarum/core/compare/v0.1.0-beta.15...v0.1.0-beta.16)
|
## [0.1.0-beta.16](https://github.com/flarum/core/compare/v0.1.0-beta.15...v0.1.0-beta.16)
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2019-2020 Stichting Flarum (Flarum Foundation)
|
Copyright (c) 2019-2021 Stichting Flarum (Flarum Foundation)
|
||||||
Copyright (c) 2014-2019 Toby Zerner (toby.zerner@gmail.com)
|
Copyright (c) 2014-2019 Toby Zerner (toby.zerner@gmail.com)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -5,10 +5,10 @@
|
|||||||
<a href="https://packagist.org/packages/flarum/core"><img src="https://img.shields.io/packagist/dt/flarum/core" alt="Total Downloads"></a>
|
<a href="https://packagist.org/packages/flarum/core"><img src="https://img.shields.io/packagist/dt/flarum/core" alt="Total Downloads"></a>
|
||||||
<a href="https://packagist.org/packages/flarum/core"><img src="https://img.shields.io/github/v/release/flarum/core?sort=semver" alt="Latest Version"></a>
|
<a href="https://packagist.org/packages/flarum/core"><img src="https://img.shields.io/github/v/release/flarum/core?sort=semver" alt="Latest Version"></a>
|
||||||
<a href="https://packagist.org/packages/flarum/core"><img src="https://img.shields.io/packagist/l/flarum/core" alt="License"></a>
|
<a href="https://packagist.org/packages/flarum/core"><img src="https://img.shields.io/packagist/l/flarum/core" alt="License"></a>
|
||||||
|
<a href="https://huntr.dev/bounties/disclose/?target=https://github.com/flarum/core"><img src="https://cdn.huntr.dev/huntr_security_badge_mono.svg" alt="huntr"></a>
|
||||||
<a href="https://github.styleci.io/repos/28257573"><img src="https://github.styleci.io/repos/28257573/shield?style=flat" alt="StyleCI"></a>
|
<a href="https://github.styleci.io/repos/28257573"><img src="https://github.styleci.io/repos/28257573/shield?style=flat" alt="StyleCI"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
## About Flarum
|
## About Flarum
|
||||||
|
|
||||||
**[Flarum](https://flarum.org/) is a delightfully simple discussion platform for your website.** It's fast and easy to use, with all the features you need to run a successful community. It is designed to be:
|
**[Flarum](https://flarum.org/) is a delightfully simple discussion platform for your website.** It's fast and easy to use, with all the features you need to run a successful community. It is designed to be:
|
||||||
@@ -19,13 +19,15 @@
|
|||||||
|
|
||||||
* **Powerful and extensible.** Customize, extend, and integrate Flarum to suit your community. Flarum’s architecture is amazingly flexible, with a powerful Extension API.
|
* **Powerful and extensible.** Customize, extend, and integrate Flarum to suit your community. Flarum’s architecture is amazingly flexible, with a powerful Extension API.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
This repository contains Flarum's core code. If you want to set up a forum, visit the [Flarum skeleton repository](https://github.com/flarum/flarum).
|
This repository contains Flarum's core code. If you want to set up a forum, visit the [Flarum skeleton repository](https://github.com/flarum/flarum). For support, refer to the [documentation](https://docs.flarum.org/), and ask questions on [Flarum Discuss](https://discuss.flarum.org/) (our community forum) or [Discord server](https://flarum.org/discord/).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Thank you for considering contributing to Flarum! Please read the **[Contributing guide](https://flarum.org/docs/contributing.html)** to learn how you can help.
|
Thank you for considering contributing to Flarum! Please read the **[Contributing guide](https://docs.flarum.org/contributing)** to learn how you can help.
|
||||||
|
|
||||||
## Security Vulnerabilities
|
## Security Vulnerabilities
|
||||||
|
|
||||||
|
@@ -14,10 +14,26 @@
|
|||||||
"homepage": "https://flarum.org/team"
|
"homepage": "https://flarum.org/team"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/flarum"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/flarum"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "other",
|
||||||
|
"url": "https://flarum.org/donate"
|
||||||
|
}
|
||||||
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/flarum/core/issues",
|
"issues": "https://github.com/flarum/core/issues",
|
||||||
"source": "https://github.com/flarum/core",
|
"source": "https://github.com/flarum/core",
|
||||||
"docs": "https://flarum.org/docs/"
|
"docs": "https://docs.flarum.org",
|
||||||
|
"forum": "https://discuss.flarum.org",
|
||||||
|
"chat": "https://flarum.org/chat"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.3",
|
"php": ">=7.3",
|
||||||
@@ -43,7 +59,7 @@
|
|||||||
"illuminate/support": "^8.0",
|
"illuminate/support": "^8.0",
|
||||||
"illuminate/validation": "^8.0",
|
"illuminate/validation": "^8.0",
|
||||||
"illuminate/view": "^8.0",
|
"illuminate/view": "^8.0",
|
||||||
"intervention/image": "^2.5.0",
|
"intervention/image": "2.5.* || ^2.6.1",
|
||||||
"laminas/laminas-diactoros": "^2.4.1",
|
"laminas/laminas-diactoros": "^2.4.1",
|
||||||
"laminas/laminas-httphandlerrunner": "^1.2.0",
|
"laminas/laminas-httphandlerrunner": "^1.2.0",
|
||||||
"laminas/laminas-stratigility": "^3.2.2",
|
"laminas/laminas-stratigility": "^3.2.2",
|
||||||
@@ -63,13 +79,14 @@
|
|||||||
"symfony/console": "^5.2.2",
|
"symfony/console": "^5.2.2",
|
||||||
"symfony/event-dispatcher": "^5.2.2",
|
"symfony/event-dispatcher": "^5.2.2",
|
||||||
"symfony/mime": "^5.2.0",
|
"symfony/mime": "^5.2.0",
|
||||||
|
"symfony/polyfill-intl-messageformatter": "^1.22.0",
|
||||||
"symfony/translation": "^5.1.5",
|
"symfony/translation": "^5.1.5",
|
||||||
"symfony/yaml": "^5.2.2",
|
"symfony/yaml": "^5.2.2",
|
||||||
"tobscure/json-api": "^0.3.0",
|
"tobscure/json-api": "^0.3.0",
|
||||||
"wikimedia/less.php": "^3.0"
|
"wikimedia/less.php": "^3.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"flarum/testing": "^0.1.0-beta.16"
|
"flarum/testing": "^1.0.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@@ -89,7 +106,29 @@
|
|||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "0.1.x-dev"
|
"dev-master": "1.x-dev"
|
||||||
|
},
|
||||||
|
"flarum-cli": {
|
||||||
|
"excludeScaffolding": [
|
||||||
|
"LICENSE.md",
|
||||||
|
"js/tsconfig.json",
|
||||||
|
"js/webpack.config.js"
|
||||||
|
],
|
||||||
|
"modules": {
|
||||||
|
"backendTesting": true,
|
||||||
|
"js": true,
|
||||||
|
"gitConf": true,
|
||||||
|
"githubActions": true,
|
||||||
|
"prettier": true,
|
||||||
|
"typescript": true,
|
||||||
|
"bundlewatch": true,
|
||||||
|
"editorConfig": true,
|
||||||
|
"styleci": true,
|
||||||
|
"admin": true,
|
||||||
|
"forum": true,
|
||||||
|
"jsCommon": true,
|
||||||
|
"css": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
9
js/.gitignore
vendored
Normal file
9
js/.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
.pnp.*
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
|
|
||||||
|
node_modules
|
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"printWidth": 150,
|
|
||||||
"singleQuote": true,
|
|
||||||
"tabWidth": 2,
|
|
||||||
"trailingComma": "es5"
|
|
||||||
}
|
|
768
js/.yarn/releases/yarn-3.1.1.cjs
vendored
Executable file
768
js/.yarn/releases/yarn-3.1.1.cjs
vendored
Executable file
File diff suppressed because one or more lines are too long
3
js/.yarnrc.yml
Normal file
3
js/.yarnrc.yml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
nodeLinker: node-modules
|
||||||
|
|
||||||
|
yarnPath: .yarn/releases/yarn-3.1.1.cjs
|
11
js/admin.js
11
js/admin.js
@@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of Flarum.
|
|
||||||
*
|
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export * from './src/common';
|
|
||||||
export * from './src/admin';
|
|
2
js/admin.ts
Normal file
2
js/admin.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export * from './src/common';
|
||||||
|
export * from './src/admin';
|
138
js/dist-typings/@types/global.d.ts
vendored
Normal file
138
js/dist-typings/@types/global.d.ts
vendored
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
declare type Writable<T> = { -readonly [P in keyof T]: T[P] };
|
||||||
|
declare type DeepWritable<T> = { -readonly [P in keyof T]: DeepWritable<T[P]> };
|
||||||
|
|
||||||
|
declare type DeepReadonly<T> = { readonly [P in keyof T]: DeepReadonly<T[P]> };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UTILITY TYPES
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type that returns an array of all keys of a provided object that are of
|
||||||
|
* of the provided type, or a subtype of the type.
|
||||||
|
*/
|
||||||
|
declare type KeysOfType<Type extends object, Match> = {
|
||||||
|
[Key in keyof Type]-?: Type[Key] extends Match ? Key : never;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type that matches one of the keys of an object that is of the provided
|
||||||
|
* type, or a subtype of it.
|
||||||
|
*/
|
||||||
|
declare type KeyOfType<Type extends object, Match> = KeysOfType<Type, Match>[keyof Type];
|
||||||
|
|
||||||
|
type Component<A> = import('mithril').Component<A>;
|
||||||
|
|
||||||
|
declare type ComponentClass<Attrs = Record<string, unknown>, C extends Component<Attrs> = Component<Attrs>> = {
|
||||||
|
new (...args: any[]): Component<Attrs>;
|
||||||
|
prototype: C;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unfortunately, TypeScript only supports strings and classes for JSX tags.
|
||||||
|
* Therefore, our type definition should only allow for those two types.
|
||||||
|
*
|
||||||
|
* @see https://github.com/microsoft/TypeScript/issues/14789#issuecomment-412247771
|
||||||
|
*/
|
||||||
|
declare type VnodeElementTag<Attrs = Record<string, unknown>, C extends Component<Attrs> = Component<Attrs>> = string | ComponentClass<Attrs, C>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Please import `app` from a namespace instead of using it as a global variable.
|
||||||
|
*
|
||||||
|
* @example App in forum JS
|
||||||
|
* ```
|
||||||
|
* import app from 'flarum/forum/app';
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @example App in admin JS
|
||||||
|
* ```
|
||||||
|
* import app from 'flarum/admin/app';
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @example App in common JS
|
||||||
|
* ```
|
||||||
|
* import app from 'flarum/common/app';
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
declare const app: never;
|
||||||
|
|
||||||
|
declare const m: import('mithril').Static;
|
||||||
|
declare const dayjs: typeof import('dayjs');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From https://github.com/lokesh/color-thief/issues/188
|
||||||
|
*/
|
||||||
|
declare module 'color-thief-browser' {
|
||||||
|
type Color = [number, number, number];
|
||||||
|
export default class ColorThief {
|
||||||
|
getColor: (img: HTMLImageElement | null) => Color;
|
||||||
|
getPalette: (img: HTMLImageElement | null) => Color[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ESModule = { __esModule: true; [key: string]: unknown };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The global `flarum` variable.
|
||||||
|
*
|
||||||
|
* Contains the compiled ES Modules for all Flarum extensions and core.
|
||||||
|
*
|
||||||
|
* @example <caption>Check if `flarum-tags` is present</captions>
|
||||||
|
* if ('flarum-tags' in flarum.extensions) {
|
||||||
|
* // Tags is installed and enabled!
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
interface FlarumObject {
|
||||||
|
/**
|
||||||
|
* Contains the compiled ES Module for Flarum's core.
|
||||||
|
*
|
||||||
|
* You shouldn't need to access this directly for any reason.
|
||||||
|
*/
|
||||||
|
core: Readonly<ESModule>;
|
||||||
|
/**
|
||||||
|
* Contains the compiled ES Modules for all Flarum extensions.
|
||||||
|
*
|
||||||
|
* @example <caption>Check if `flarum-tags` is present</captions>
|
||||||
|
* if ('flarum-tags' in flarum.extensions) {
|
||||||
|
* // Tags is installed and enabled!
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
extensions: Readonly<Record<string, ESModule>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare const flarum: FlarumObject;
|
||||||
|
|
||||||
|
// Extend JQuery with our custom functions, defined with $.fn
|
||||||
|
interface JQuery {
|
||||||
|
/**
|
||||||
|
* Flarum's tooltip JQuery plugin.
|
||||||
|
*
|
||||||
|
* Do not use this directly. Instead use the `<Tooltip>` component that
|
||||||
|
* is exported from `flarum/common/components/Tooltip`.
|
||||||
|
*
|
||||||
|
* This will be removed in a future version of Flarum.
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
tooltip: import('./tooltips/index').TooltipJQueryFunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For more info, see: https://www.typescriptlang.org/docs/handbook/jsx.html#attribute-type-checking
|
||||||
|
*
|
||||||
|
* In a nutshell, we need to add `ElementAttributesProperty` to tell Typescript
|
||||||
|
* what property on component classes to look at for attribute typings. For our
|
||||||
|
* Component class, this would be `attrs` (e.g. `this.attrs...`)
|
||||||
|
*/
|
||||||
|
interface JSX {
|
||||||
|
ElementAttributesProperty: {
|
||||||
|
attrs: Record<string, unknown>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Event {
|
||||||
|
/**
|
||||||
|
* Whether this event should trigger a Mithril redraw.
|
||||||
|
*/
|
||||||
|
redraw: boolean;
|
||||||
|
}
|
68
js/dist-typings/@types/tooltips/index.d.ts
vendored
Normal file
68
js/dist-typings/@types/tooltips/index.d.ts
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* Selection of options accepted by [Bootstrap's tooltips](https://getbootstrap.com/docs/3.3/javascript/#tooltips-options).
|
||||||
|
*
|
||||||
|
* ---
|
||||||
|
*
|
||||||
|
* Not all options are present from Bootstrap to discourage the use of options
|
||||||
|
* that will be deprecated in the future.
|
||||||
|
*
|
||||||
|
* More commonly used options that will be deprecated remain, but are marked as
|
||||||
|
* such.
|
||||||
|
*
|
||||||
|
* @see https://getbootstrap.com/docs/3.3/javascript/#tooltips-options
|
||||||
|
*/
|
||||||
|
export interface TooltipCreationOptions {
|
||||||
|
/**
|
||||||
|
* Whether HTML content is allowed in the tooltip.
|
||||||
|
*
|
||||||
|
* ---
|
||||||
|
*
|
||||||
|
* **Warning:** this is a possible XSS attack vector. This option shouldn't
|
||||||
|
* be used wherever possible, and will not work when we migrate to CSS-only
|
||||||
|
* tooltips.
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
html?: boolean;
|
||||||
|
/**
|
||||||
|
* Tooltip position around the target element.
|
||||||
|
*/
|
||||||
|
placement?: 'top' | 'bottom' | 'left' | 'right';
|
||||||
|
/**
|
||||||
|
* Sets the delay between a trigger state occurring and the tooltip appearing
|
||||||
|
* on-screen.
|
||||||
|
*
|
||||||
|
* ---
|
||||||
|
*
|
||||||
|
* **Warning:** this option will be removed when we switch to CSS-only
|
||||||
|
* tooltips.
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
delay?: number;
|
||||||
|
/**
|
||||||
|
* Value used if no `title` attribute is present on the HTML element.
|
||||||
|
*
|
||||||
|
* If a function is given, it will be called with its `this` reference set to
|
||||||
|
* the element that the tooltip is attached to.
|
||||||
|
*/
|
||||||
|
title?: string;
|
||||||
|
/**
|
||||||
|
* How the tooltip is triggered.
|
||||||
|
*
|
||||||
|
* Either on `hover`, on `hover focus` (either of the two).
|
||||||
|
*
|
||||||
|
* ---
|
||||||
|
*
|
||||||
|
* **Warning:** `manual`, `click` and `focus` on its own are deprecated options
|
||||||
|
* which will not be supported in the future.
|
||||||
|
*/
|
||||||
|
trigger?: 'hover' | 'hover focus';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a tooltip on a jQuery element reference.
|
||||||
|
*
|
||||||
|
* Returns the same jQuery reference to allow for method chaining.
|
||||||
|
*/
|
||||||
|
export type TooltipJQueryFunction = (tooltipOptions?: TooltipCreationOptions | 'destroy' | 'show' | 'hide') => JQuery;
|
61
js/dist-typings/admin/AdminApplication.d.ts
vendored
Normal file
61
js/dist-typings/admin/AdminApplication.d.ts
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import Application from '../common/Application';
|
||||||
|
import ExtensionData from './utils/ExtensionData';
|
||||||
|
export declare type Extension = {
|
||||||
|
id: string;
|
||||||
|
version: string;
|
||||||
|
description?: string;
|
||||||
|
icon?: {
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
|
links: {
|
||||||
|
authors?: {
|
||||||
|
name?: string;
|
||||||
|
link?: string;
|
||||||
|
}[];
|
||||||
|
discuss?: string;
|
||||||
|
documentation?: string;
|
||||||
|
support?: string;
|
||||||
|
website?: string;
|
||||||
|
donate?: string;
|
||||||
|
source?: string;
|
||||||
|
};
|
||||||
|
extra: {
|
||||||
|
'flarum-extension': {
|
||||||
|
title: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
export default class AdminApplication extends Application {
|
||||||
|
extensionData: ExtensionData;
|
||||||
|
extensionCategories: {
|
||||||
|
feature: number;
|
||||||
|
theme: number;
|
||||||
|
language: number;
|
||||||
|
};
|
||||||
|
history: {
|
||||||
|
canGoBack: () => boolean;
|
||||||
|
getPrevious: () => void;
|
||||||
|
backUrl: () => string;
|
||||||
|
back: () => void;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* Settings are serialized to the admin dashboard as strings.
|
||||||
|
* Additional encoding/decoding is possible, but must take
|
||||||
|
* place on the client side.
|
||||||
|
*
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
data: Application['data'] & {
|
||||||
|
extensions: Record<string, Extension>;
|
||||||
|
settings: Record<string, string>;
|
||||||
|
modelStatistics: Record<string, {
|
||||||
|
total: number;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
constructor();
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
mount(): void;
|
||||||
|
getRequiredPermissions(permission: string): string[];
|
||||||
|
}
|
3
js/dist-typings/admin/app.d.ts
vendored
Normal file
3
js/dist-typings/admin/app.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import Admin from './AdminApplication';
|
||||||
|
declare const app: Admin;
|
||||||
|
export default app;
|
165
js/dist-typings/admin/compat.d.ts
vendored
Normal file
165
js/dist-typings/admin/compat.d.ts
vendored
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
declare var _default: {
|
||||||
|
extend: any;
|
||||||
|
Session: typeof import("../common/Session").default;
|
||||||
|
Store: typeof import("../common/Store").default;
|
||||||
|
'utils/BasicEditorDriver': typeof import("../common/utils/BasicEditorDriver").default;
|
||||||
|
'utils/evented': {
|
||||||
|
handlers: Record<string, unknown>;
|
||||||
|
getHandlers(event: string): Function[];
|
||||||
|
trigger(event: string, ...args: any[]): void;
|
||||||
|
on(event: string, handler: Function): void;
|
||||||
|
one(event: string, handler: Function): void;
|
||||||
|
off(event: string, handler: Function): void;
|
||||||
|
};
|
||||||
|
'utils/liveHumanTimes': typeof import("../common/utils/liveHumanTimes").default;
|
||||||
|
'utils/ItemList': typeof import("../common/utils/ItemList").default;
|
||||||
|
'utils/mixin': typeof import("../common/utils/mixin").default;
|
||||||
|
'utils/humanTime': typeof import("../common/utils/humanTime").default;
|
||||||
|
'utils/computed': typeof import("../common/utils/computed").default;
|
||||||
|
'utils/insertText': typeof import("../common/utils/insertText").default;
|
||||||
|
'utils/styleSelectedText': typeof import("../common/utils/styleSelectedText").default;
|
||||||
|
'utils/Drawer': typeof import("../common/utils/Drawer").default;
|
||||||
|
'utils/anchorScroll': typeof import("../common/utils/anchorScroll").default;
|
||||||
|
'utils/RequestError': typeof import("../common/utils/RequestError").default;
|
||||||
|
'utils/abbreviateNumber': typeof import("../common/utils/abbreviateNumber").default;
|
||||||
|
'utils/string': typeof import("../common/utils/string");
|
||||||
|
'utils/SubtreeRetainer': typeof import("../common/utils/SubtreeRetainer").default;
|
||||||
|
'utils/escapeRegExp': typeof import("../common/utils/escapeRegExp").default;
|
||||||
|
'utils/extract': typeof import("../common/utils/extract").default;
|
||||||
|
'utils/ScrollListener': typeof import("../common/utils/ScrollListener").default;
|
||||||
|
'utils/stringToColor': typeof import("../common/utils/stringToColor").default;
|
||||||
|
'utils/Stream': typeof import("mithril/stream");
|
||||||
|
'utils/subclassOf': typeof import("../common/utils/subclassOf").default;
|
||||||
|
'utils/setRouteWithForcedRefresh': typeof import("../common/utils/setRouteWithForcedRefresh").default;
|
||||||
|
'utils/patchMithril': typeof import("../common/utils/patchMithril").default;
|
||||||
|
'utils/proxifyCompat': typeof import("../common/utils/proxifyCompat").default;
|
||||||
|
'utils/classList': (...classes: import("clsx").ClassValue[]) => string;
|
||||||
|
'utils/extractText': typeof import("../common/utils/extractText").default;
|
||||||
|
'utils/formatNumber': typeof import("../common/utils/formatNumber").default;
|
||||||
|
'utils/mapRoutes': typeof import("../common/utils/mapRoutes").default;
|
||||||
|
'utils/withAttr': (key: string, cb: Function) => (this: Element) => void;
|
||||||
|
'utils/throttleDebounce': typeof import("../common/utils/throttleDebounce");
|
||||||
|
'utils/isObject': typeof import("../common/utils/isObject").default;
|
||||||
|
'utils/focusTrap': typeof import("../common/utils/focusTrap");
|
||||||
|
'models/Notification': typeof import("../common/models/Notification").default;
|
||||||
|
'models/User': typeof import("../common/models/User").default;
|
||||||
|
'models/Post': typeof import("../common/models/Post").default;
|
||||||
|
'models/Discussion': typeof import("../common/models/Discussion").default;
|
||||||
|
'models/Group': typeof import("../common/models/Group").default;
|
||||||
|
'models/Forum': typeof import("../common/models/Forum").default;
|
||||||
|
Component: typeof import("../common/Component").default;
|
||||||
|
Fragment: typeof import("../common/Fragment").default;
|
||||||
|
Translator: typeof import("../common/Translator").default;
|
||||||
|
'components/AlertManager': typeof import("../common/components/AlertManager").default;
|
||||||
|
'components/Page': typeof import("../common/components/Page").default;
|
||||||
|
'components/Switch': typeof import("../common/components/Switch").default;
|
||||||
|
'components/Badge': typeof import("../common/components/Badge").default;
|
||||||
|
'components/LoadingIndicator': typeof import("../common/components/LoadingIndicator").default;
|
||||||
|
'components/Placeholder': typeof import("../common/components/Placeholder").default;
|
||||||
|
'components/Separator': typeof import("../common/components/Separator").default;
|
||||||
|
'components/Dropdown': typeof import("../common/components/Dropdown").default;
|
||||||
|
'components/SplitDropdown': typeof import("../common/components/SplitDropdown").default;
|
||||||
|
'components/RequestErrorModal': typeof import("../common/components/RequestErrorModal").default;
|
||||||
|
'components/FieldSet': typeof import("../common/components/FieldSet").default;
|
||||||
|
'components/Select': typeof import("../common/components/Select").default;
|
||||||
|
'components/Navigation': typeof import("../common/components/Navigation").default;
|
||||||
|
'components/Alert': typeof import("../common/components/Alert").default;
|
||||||
|
'components/Link': typeof import("../common/components/Link").default;
|
||||||
|
'components/LinkButton': typeof import("../common/components/LinkButton").default;
|
||||||
|
'components/Checkbox': typeof import("../common/components/Checkbox").default;
|
||||||
|
'components/ColorPreviewInput': typeof import("../common/components/ColorPreviewInput").default;
|
||||||
|
'components/SelectDropdown': typeof import("../common/components/SelectDropdown").default;
|
||||||
|
'components/ModalManager': typeof import("../common/components/ModalManager").default;
|
||||||
|
'components/Button': typeof import("../common/components/Button").default;
|
||||||
|
'components/Modal': typeof import("../common/components/Modal").default;
|
||||||
|
'components/GroupBadge': typeof import("../common/components/GroupBadge").default;
|
||||||
|
'components/TextEditor': typeof import("../common/components/TextEditor").default;
|
||||||
|
'components/TextEditorButton': typeof import("../common/components/TextEditorButton").default;
|
||||||
|
'components/Tooltip': typeof import("../common/components/Tooltip").default;
|
||||||
|
'components/EditUserModal': typeof import("../common/components/EditUserModal").default;
|
||||||
|
Model: typeof import("../common/Model").default;
|
||||||
|
Application: typeof import("../common/Application").default;
|
||||||
|
'helpers/fullTime': typeof import("../common/helpers/fullTime").default;
|
||||||
|
'helpers/avatar': typeof import("../common/helpers/avatar").default;
|
||||||
|
'helpers/icon': typeof import("../common/helpers/icon").default;
|
||||||
|
'helpers/humanTime': typeof import("../common/helpers/humanTime").default;
|
||||||
|
'helpers/punctuateSeries': typeof import("../common/helpers/punctuateSeries").default;
|
||||||
|
'helpers/highlight': typeof import("../common/helpers/highlight").default;
|
||||||
|
'helpers/username': typeof import("../common/helpers/username").default;
|
||||||
|
'helpers/userOnline': typeof import("../common/helpers/userOnline").default;
|
||||||
|
'helpers/listItems': typeof import("../common/helpers/listItems").default;
|
||||||
|
'resolvers/DefaultResolver': typeof import("../common/resolvers/DefaultResolver").default;
|
||||||
|
'states/PaginatedListState': typeof import("../common/states/PaginatedListState").default;
|
||||||
|
} & {
|
||||||
|
'utils/saveSettings': typeof saveSettings;
|
||||||
|
'utils/ExtensionData': typeof ExtensionData;
|
||||||
|
'utils/isExtensionEnabled': typeof isExtensionEnabled;
|
||||||
|
'utils/getCategorizedExtensions': typeof getCategorizedExtensions;
|
||||||
|
'utils/generateElementId': typeof generateElementId;
|
||||||
|
'components/SettingDropdown': typeof SettingDropdown;
|
||||||
|
'components/EditCustomFooterModal': typeof EditCustomFooterModal;
|
||||||
|
'components/SessionDropdown': typeof SessionDropdown;
|
||||||
|
'components/HeaderPrimary': typeof HeaderPrimary;
|
||||||
|
'components/AdminPage': typeof AdminPage;
|
||||||
|
'components/AppearancePage': typeof AppearancePage;
|
||||||
|
'components/StatusWidget': typeof StatusWidget;
|
||||||
|
'components/ExtensionsWidget': typeof ExtensionsWidget;
|
||||||
|
'components/HeaderSecondary': typeof HeaderSecondary;
|
||||||
|
'components/SettingsModal': typeof SettingsModal;
|
||||||
|
'components/DashboardWidget': typeof DashboardWidget;
|
||||||
|
'components/ExtensionPage': typeof ExtensionPage;
|
||||||
|
'components/ExtensionLinkButton': typeof ExtensionLinkButton;
|
||||||
|
'components/PermissionGrid': typeof PermissionGrid;
|
||||||
|
'components/ExtensionPermissionGrid': typeof ExtensionPermissionGrid;
|
||||||
|
'components/MailPage': typeof MailPage;
|
||||||
|
'components/UploadImageButton': typeof UploadImageButton;
|
||||||
|
'components/LoadingModal': typeof LoadingModal;
|
||||||
|
'components/DashboardPage': typeof DashboardPage;
|
||||||
|
'components/BasicsPage': typeof BasicsPage;
|
||||||
|
'components/UserListPage': typeof UserListPage;
|
||||||
|
'components/EditCustomHeaderModal': typeof EditCustomHeaderModal;
|
||||||
|
'components/PermissionsPage': typeof PermissionsPage;
|
||||||
|
'components/PermissionDropdown': typeof PermissionDropdown;
|
||||||
|
'components/AdminNav': typeof AdminNav;
|
||||||
|
'components/AdminHeader': typeof AdminHeader;
|
||||||
|
'components/EditCustomCssModal': typeof EditCustomCssModal;
|
||||||
|
'components/EditGroupModal': typeof EditGroupModal;
|
||||||
|
routes: typeof routes;
|
||||||
|
AdminApplication: typeof AdminApplication;
|
||||||
|
};
|
||||||
|
export default _default;
|
||||||
|
import saveSettings from "./utils/saveSettings";
|
||||||
|
import ExtensionData from "./utils/ExtensionData";
|
||||||
|
import isExtensionEnabled from "./utils/isExtensionEnabled";
|
||||||
|
import getCategorizedExtensions from "./utils/getCategorizedExtensions";
|
||||||
|
import generateElementId from "./utils/generateElementId";
|
||||||
|
import SettingDropdown from "./components/SettingDropdown";
|
||||||
|
import EditCustomFooterModal from "./components/EditCustomFooterModal";
|
||||||
|
import SessionDropdown from "./components/SessionDropdown";
|
||||||
|
import HeaderPrimary from "./components/HeaderPrimary";
|
||||||
|
import AdminPage from "./components/AdminPage";
|
||||||
|
import AppearancePage from "./components/AppearancePage";
|
||||||
|
import StatusWidget from "./components/StatusWidget";
|
||||||
|
import ExtensionsWidget from "./components/ExtensionsWidget";
|
||||||
|
import HeaderSecondary from "./components/HeaderSecondary";
|
||||||
|
import SettingsModal from "./components/SettingsModal";
|
||||||
|
import DashboardWidget from "./components/DashboardWidget";
|
||||||
|
import ExtensionPage from "./components/ExtensionPage";
|
||||||
|
import ExtensionLinkButton from "./components/ExtensionLinkButton";
|
||||||
|
import PermissionGrid from "./components/PermissionGrid";
|
||||||
|
import ExtensionPermissionGrid from "./components/ExtensionPermissionGrid";
|
||||||
|
import MailPage from "./components/MailPage";
|
||||||
|
import UploadImageButton from "./components/UploadImageButton";
|
||||||
|
import LoadingModal from "./components/LoadingModal";
|
||||||
|
import DashboardPage from "./components/DashboardPage";
|
||||||
|
import BasicsPage from "./components/BasicsPage";
|
||||||
|
import UserListPage from "./components/UserListPage";
|
||||||
|
import EditCustomHeaderModal from "./components/EditCustomHeaderModal";
|
||||||
|
import PermissionsPage from "./components/PermissionsPage";
|
||||||
|
import PermissionDropdown from "./components/PermissionDropdown";
|
||||||
|
import AdminNav from "./components/AdminNav";
|
||||||
|
import AdminHeader from "./components/AdminHeader";
|
||||||
|
import EditCustomCssModal from "./components/EditCustomCssModal";
|
||||||
|
import EditGroupModal from "./components/EditGroupModal";
|
||||||
|
import routes from "./routes";
|
||||||
|
import AdminApplication from "./AdminApplication";
|
4
js/dist-typings/admin/components/AdminHeader.d.ts
vendored
Normal file
4
js/dist-typings/admin/components/AdminHeader.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export default class AdminHeader extends Component<import("../../common/Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Component from "../../common/Component";
|
15
js/dist-typings/admin/components/AdminNav.d.ts
vendored
Normal file
15
js/dist-typings/admin/components/AdminNav.d.ts
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
export default class AdminNav extends Component<import("../../common/Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
query: Stream<string> | undefined;
|
||||||
|
scrollToActive(): void;
|
||||||
|
/**
|
||||||
|
* Build an item list of main links to show in the admin navigation.
|
||||||
|
*
|
||||||
|
* @return {ItemList<import('mithril').Children>}
|
||||||
|
*/
|
||||||
|
items(): ItemList<import('mithril').Children>;
|
||||||
|
extensionItems(): ItemList<any>;
|
||||||
|
}
|
||||||
|
import Component from "../../common/Component";
|
||||||
|
import Stream from "../../common/utils/Stream";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
167
js/dist-typings/admin/components/AdminPage.d.ts
vendored
Normal file
167
js/dist-typings/admin/components/AdminPage.d.ts
vendored
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
import type Mithril from 'mithril';
|
||||||
|
import Page, { IPageAttrs } from '../../common/components/Page';
|
||||||
|
import Stream from '../../common/utils/Stream';
|
||||||
|
export interface AdminHeaderOptions {
|
||||||
|
title: Mithril.Children;
|
||||||
|
description: Mithril.Children;
|
||||||
|
icon: string;
|
||||||
|
/**
|
||||||
|
* Will be used as the class for the AdminPage.
|
||||||
|
*
|
||||||
|
* Will also be appended with `-header` and set as the class for the `AdminHeader` component.
|
||||||
|
*/
|
||||||
|
className: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A type that matches any valid value for the `type` attribute on an HTML `<input>` element.
|
||||||
|
*
|
||||||
|
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type
|
||||||
|
*
|
||||||
|
* Note: this will be exported from a different location in the future.
|
||||||
|
*
|
||||||
|
* @see https://github.com/flarum/core/issues/3039
|
||||||
|
*/
|
||||||
|
export declare type HTMLInputTypes = 'button' | 'checkbox' | 'color' | 'date' | 'datetime-local' | 'email' | 'file' | 'hidden' | 'image' | 'month' | 'number' | 'password' | 'radio' | 'range' | 'reset' | 'search' | 'submit' | 'tel' | 'text' | 'time' | 'url' | 'week';
|
||||||
|
interface CommonSettingsItemOptions extends Mithril.Attributes {
|
||||||
|
setting: string;
|
||||||
|
label: Mithril.Children;
|
||||||
|
help?: Mithril.Children;
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Valid options for the setting component builder to generate an HTML input element.
|
||||||
|
*/
|
||||||
|
export interface HTMLInputSettingsComponentOptions extends CommonSettingsItemOptions {
|
||||||
|
/**
|
||||||
|
* Any valid HTML input `type` value.
|
||||||
|
*/
|
||||||
|
type: HTMLInputTypes;
|
||||||
|
}
|
||||||
|
declare const BooleanSettingTypes: readonly ["bool", "checkbox", "switch", "boolean"];
|
||||||
|
declare const SelectSettingTypes: readonly ["select", "dropdown", "selectdropdown"];
|
||||||
|
declare const TextareaSettingTypes: readonly ["textarea"];
|
||||||
|
declare const ColorPreviewSettingType = "color-preview";
|
||||||
|
/**
|
||||||
|
* Valid options for the setting component builder to generate a Switch.
|
||||||
|
*/
|
||||||
|
export interface SwitchSettingComponentOptions extends CommonSettingsItemOptions {
|
||||||
|
type: typeof BooleanSettingTypes[number];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Valid options for the setting component builder to generate a Select dropdown.
|
||||||
|
*/
|
||||||
|
export interface SelectSettingComponentOptions extends CommonSettingsItemOptions {
|
||||||
|
type: typeof SelectSettingTypes[number];
|
||||||
|
/**
|
||||||
|
* Map of values to their labels
|
||||||
|
*/
|
||||||
|
options: {
|
||||||
|
[value: string]: Mithril.Children;
|
||||||
|
};
|
||||||
|
default: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Valid options for the setting component builder to generate a Textarea.
|
||||||
|
*/
|
||||||
|
export interface TextareaSettingComponentOptions extends CommonSettingsItemOptions {
|
||||||
|
type: typeof TextareaSettingTypes[number];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Valid options for the setting component builder to generate a ColorPreviewInput.
|
||||||
|
*/
|
||||||
|
export interface ColorPreviewSettingComponentOptions extends CommonSettingsItemOptions {
|
||||||
|
type: typeof ColorPreviewSettingType;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* All valid options for the setting component builder.
|
||||||
|
*/
|
||||||
|
export declare type SettingsComponentOptions = HTMLInputSettingsComponentOptions | SwitchSettingComponentOptions | SelectSettingComponentOptions | TextareaSettingComponentOptions | ColorPreviewSettingComponentOptions;
|
||||||
|
/**
|
||||||
|
* Valid attrs that can be returned by the `headerInfo` function
|
||||||
|
*/
|
||||||
|
export declare type AdminHeaderAttrs = AdminHeaderOptions & Partial<Omit<Mithril.Attributes, 'class'>>;
|
||||||
|
export default abstract class AdminPage<CustomAttrs extends IPageAttrs = IPageAttrs> extends Page<CustomAttrs> {
|
||||||
|
settings: Record<string, Stream<string>>;
|
||||||
|
loading: boolean;
|
||||||
|
view(vnode: Mithril.Vnode<CustomAttrs, this>): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Returns the content of the AdminPage.
|
||||||
|
*/
|
||||||
|
abstract content(vnode: Mithril.Vnode<CustomAttrs, this>): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Returns the submit button for this AdminPage.
|
||||||
|
*
|
||||||
|
* Calls `this.saveSettings` when the button is clicked.
|
||||||
|
*/
|
||||||
|
submitButton(vnode: Mithril.Vnode<CustomAttrs, this>): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Returns the Header component for this AdminPage.
|
||||||
|
*/
|
||||||
|
header(vnode: Mithril.Vnode<CustomAttrs, this>): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Returns the options passed to the AdminHeader component.
|
||||||
|
*/
|
||||||
|
headerInfo(): AdminHeaderAttrs;
|
||||||
|
/**
|
||||||
|
* `buildSettingComponent` takes a settings object and turns it into a component.
|
||||||
|
* Depending on the type of input, you can set the type to 'bool', 'select', or
|
||||||
|
* any standard <input> type. Any values inside the 'extra' object will be added
|
||||||
|
* to the component as an attribute.
|
||||||
|
*
|
||||||
|
* Alternatively, you can pass a callback that will be executed in ExtensionPage's
|
||||||
|
* context to include custom JSX elements.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* setting: 'acme.checkbox',
|
||||||
|
* label: app.translator.trans('acme.admin.setting_label'),
|
||||||
|
* type: 'bool',
|
||||||
|
* help: app.translator.trans('acme.admin.setting_help'),
|
||||||
|
* className: 'Setting-item'
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* setting: 'acme.select',
|
||||||
|
* label: app.translator.trans('acme.admin.setting_label'),
|
||||||
|
* type: 'select',
|
||||||
|
* options: {
|
||||||
|
* 'option1': 'Option 1 label',
|
||||||
|
* 'option2': 'Option 2 label',
|
||||||
|
* },
|
||||||
|
* default: 'option1',
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* () => {
|
||||||
|
* return <p>My cool component</p>;
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
buildSettingComponent(entry: ((this: this) => Mithril.Children) | SettingsComponentOptions): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Called when `saveSettings` completes successfully.
|
||||||
|
*/
|
||||||
|
onsaved(): void;
|
||||||
|
/**
|
||||||
|
* Returns a function that fetches the setting from the `app` global.
|
||||||
|
*/
|
||||||
|
setting(key: string, fallback?: string): Stream<string>;
|
||||||
|
/**
|
||||||
|
* Returns a map of settings keys to values which includes only those which have been modified but not yet saved.
|
||||||
|
*/
|
||||||
|
dirty(): Record<string, string>;
|
||||||
|
/**
|
||||||
|
* Returns the number of settings that have been modified.
|
||||||
|
*/
|
||||||
|
isChanged(): number;
|
||||||
|
/**
|
||||||
|
* Saves the modified settings to the database.
|
||||||
|
*/
|
||||||
|
saveSettings(e: SubmitEvent & {
|
||||||
|
redraw: boolean;
|
||||||
|
}): Promise<void>;
|
||||||
|
}
|
||||||
|
export {};
|
6
js/dist-typings/admin/components/AppearancePage.d.ts
vendored
Normal file
6
js/dist-typings/admin/components/AppearancePage.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export default class AppearancePage extends AdminPage<import("../../common/components/Page").IPageAttrs> {
|
||||||
|
constructor();
|
||||||
|
colorItems(): ItemList<any>;
|
||||||
|
}
|
||||||
|
import AdminPage from "./AdminPage";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
18
js/dist-typings/admin/components/BasicsPage.d.ts
vendored
Normal file
18
js/dist-typings/admin/components/BasicsPage.d.ts
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
export default class BasicsPage extends AdminPage<import("../../common/components/Page").IPageAttrs> {
|
||||||
|
constructor();
|
||||||
|
localeOptions: {} | undefined;
|
||||||
|
displayNameOptions: {} | undefined;
|
||||||
|
slugDriverOptions: {} | undefined;
|
||||||
|
/**
|
||||||
|
* Build a list of options for the default homepage. Each option must be an
|
||||||
|
* object with `path` and `label` properties.
|
||||||
|
*
|
||||||
|
* @return {ItemList<{ path: string, label: import('mithril').Children }>}
|
||||||
|
*/
|
||||||
|
homePageItems(): ItemList<{
|
||||||
|
path: string;
|
||||||
|
label: import('mithril').Children;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
import AdminPage from "./AdminPage";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
6
js/dist-typings/admin/components/DashboardPage.d.ts
vendored
Normal file
6
js/dist-typings/admin/components/DashboardPage.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export default class DashboardPage extends AdminPage<import("../../common/components/Page").IPageAttrs> {
|
||||||
|
constructor();
|
||||||
|
availableWidgets(): ItemList<any>;
|
||||||
|
}
|
||||||
|
import AdminPage from "./AdminPage";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
16
js/dist-typings/admin/components/DashboardWidget.d.ts
vendored
Normal file
16
js/dist-typings/admin/components/DashboardWidget.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
export default class DashboardWidget extends Component<import("../../common/Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
/**
|
||||||
|
* Get the class name to apply to the widget.
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
className(): string;
|
||||||
|
/**
|
||||||
|
* Get the content of the widget.
|
||||||
|
*
|
||||||
|
* @return {import('mithril').Children}
|
||||||
|
*/
|
||||||
|
content(): import('mithril').Children;
|
||||||
|
}
|
||||||
|
import Component from "../../common/Component";
|
3
js/dist-typings/admin/components/EditCustomCssModal.d.ts
vendored
Normal file
3
js/dist-typings/admin/components/EditCustomCssModal.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export default class EditCustomCssModal extends SettingsModal {
|
||||||
|
}
|
||||||
|
import SettingsModal from "./SettingsModal";
|
3
js/dist-typings/admin/components/EditCustomFooterModal.d.ts
vendored
Normal file
3
js/dist-typings/admin/components/EditCustomFooterModal.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export default class EditCustomFooterModal extends SettingsModal {
|
||||||
|
}
|
||||||
|
import SettingsModal from "./SettingsModal";
|
3
js/dist-typings/admin/components/EditCustomHeaderModal.d.ts
vendored
Normal file
3
js/dist-typings/admin/components/EditCustomHeaderModal.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export default class EditCustomHeaderModal extends SettingsModal {
|
||||||
|
}
|
||||||
|
import SettingsModal from "./SettingsModal";
|
25
js/dist-typings/admin/components/EditGroupModal.d.ts
vendored
Normal file
25
js/dist-typings/admin/components/EditGroupModal.d.ts
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* The `EditGroupModal` component shows a modal dialog which allows the user
|
||||||
|
* to create or edit a group.
|
||||||
|
*/
|
||||||
|
export default class EditGroupModal extends Modal<import("../../common/components/Modal").IInternalModalAttrs> {
|
||||||
|
constructor();
|
||||||
|
group: any;
|
||||||
|
nameSingular: Stream<any> | undefined;
|
||||||
|
namePlural: Stream<any> | undefined;
|
||||||
|
icon: Stream<any> | undefined;
|
||||||
|
color: Stream<any> | undefined;
|
||||||
|
isHidden: Stream<any> | undefined;
|
||||||
|
fields(): ItemList<any>;
|
||||||
|
submitData(): {
|
||||||
|
nameSingular: any;
|
||||||
|
namePlural: any;
|
||||||
|
color: any;
|
||||||
|
icon: any;
|
||||||
|
isHidden: any;
|
||||||
|
};
|
||||||
|
deleteGroup(): void;
|
||||||
|
}
|
||||||
|
import Modal from "../../common/components/Modal";
|
||||||
|
import Stream from "../../common/utils/Stream";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
5
js/dist-typings/admin/components/ExtensionLinkButton.d.ts
vendored
Normal file
5
js/dist-typings/admin/components/ExtensionLinkButton.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export default class ExtensionLinkButton extends LinkButton {
|
||||||
|
statusItems(name: any): ItemList<any>;
|
||||||
|
}
|
||||||
|
import LinkButton from "../../common/components/LinkButton";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
32
js/dist-typings/admin/components/ExtensionPage.d.ts
vendored
Normal file
32
js/dist-typings/admin/components/ExtensionPage.d.ts
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import ItemList from '../../common/utils/ItemList';
|
||||||
|
import AdminPage from './AdminPage';
|
||||||
|
import RequestError from '../../common/utils/RequestError';
|
||||||
|
import { Extension } from '../AdminApplication';
|
||||||
|
import { IPageAttrs } from '../../common/components/Page';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
export interface ExtensionPageAttrs extends IPageAttrs {
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
export default class ExtensionPage<Attrs extends ExtensionPageAttrs = ExtensionPageAttrs> extends AdminPage<Attrs> {
|
||||||
|
extension: Extension;
|
||||||
|
changingState: boolean;
|
||||||
|
infoFields: {
|
||||||
|
discuss: string;
|
||||||
|
documentation: string;
|
||||||
|
support: string;
|
||||||
|
website: string;
|
||||||
|
donate: string;
|
||||||
|
source: string;
|
||||||
|
};
|
||||||
|
oninit(vnode: Mithril.Vnode<Attrs, this>): void;
|
||||||
|
className(): string;
|
||||||
|
view(vnode: Mithril.VnodeDOM<Attrs, this>): JSX.Element | null;
|
||||||
|
header(): JSX.Element[];
|
||||||
|
sections(vnode: Mithril.VnodeDOM<Attrs, this>): ItemList<unknown>;
|
||||||
|
content(vnode: Mithril.VnodeDOM<Attrs, this>): JSX.Element;
|
||||||
|
topItems(): ItemList<Mithril.Children>;
|
||||||
|
infoItems(): ItemList<Mithril.Children>;
|
||||||
|
toggle(): void;
|
||||||
|
isEnabled(): any;
|
||||||
|
onerror(e: RequestError): void;
|
||||||
|
}
|
19
js/dist-typings/admin/components/ExtensionPermissionGrid.d.ts
vendored
Normal file
19
js/dist-typings/admin/components/ExtensionPermissionGrid.d.ts
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import PermissionGrid, { PermissionGridEntry } from './PermissionGrid';
|
||||||
|
import ItemList from '../../common/utils/ItemList';
|
||||||
|
import Mithril from 'mithril';
|
||||||
|
export interface IExtensionPermissionGridAttrs {
|
||||||
|
extensionId: string;
|
||||||
|
}
|
||||||
|
export default class ExtensionPermissionGrid<CustomAttrs extends IExtensionPermissionGridAttrs = IExtensionPermissionGridAttrs> extends PermissionGrid<CustomAttrs> {
|
||||||
|
protected extensionId: string;
|
||||||
|
oninit(vnode: Mithril.Vnode<CustomAttrs, this>): void;
|
||||||
|
permissionItems(): ItemList<{
|
||||||
|
label: Mithril.Children;
|
||||||
|
children: PermissionGridEntry[];
|
||||||
|
}>;
|
||||||
|
viewItems(): ItemList<import("./PermissionGrid").PermissionConfig>;
|
||||||
|
startItems(): ItemList<import("./PermissionGrid").PermissionConfig>;
|
||||||
|
replyItems(): ItemList<import("./PermissionGrid").PermissionConfig>;
|
||||||
|
moderateItems(): ItemList<import("./PermissionGrid").PermissionConfig>;
|
||||||
|
scopeControlItems(): ItemList<unknown>;
|
||||||
|
}
|
6
js/dist-typings/admin/components/ExtensionsWidget.d.ts
vendored
Normal file
6
js/dist-typings/admin/components/ExtensionsWidget.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export default class ExtensionsWidget extends DashboardWidget {
|
||||||
|
categorizedExtensions: {} | undefined;
|
||||||
|
extensionCategory(category: any): JSX.Element;
|
||||||
|
extensionWidget(extension: any): JSX.Element;
|
||||||
|
}
|
||||||
|
import DashboardWidget from "./DashboardWidget";
|
16
js/dist-typings/admin/components/HeaderPrimary.d.ts
vendored
Normal file
16
js/dist-typings/admin/components/HeaderPrimary.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* The `HeaderPrimary` component displays primary header controls. On the
|
||||||
|
* default skin, these are shown just to the right of the forum title.
|
||||||
|
*/
|
||||||
|
export default class HeaderPrimary extends Component<import("../../common/Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
config(isInitialized: any, context: any): void;
|
||||||
|
/**
|
||||||
|
* Build an item list for the controls.
|
||||||
|
*
|
||||||
|
* @return {ItemList<import('mithril').Children>}
|
||||||
|
*/
|
||||||
|
items(): ItemList<import('mithril').Children>;
|
||||||
|
}
|
||||||
|
import Component from "../../common/Component";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
14
js/dist-typings/admin/components/HeaderSecondary.d.ts
vendored
Normal file
14
js/dist-typings/admin/components/HeaderSecondary.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* The `HeaderSecondary` component displays secondary header controls.
|
||||||
|
*/
|
||||||
|
export default class HeaderSecondary extends Component<import("../../common/Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
/**
|
||||||
|
* Build an item list for the controls.
|
||||||
|
*
|
||||||
|
* @return {ItemList<import('mithril').Children>}
|
||||||
|
*/
|
||||||
|
items(): ItemList<import('mithril').Children>;
|
||||||
|
}
|
||||||
|
import Component from "../../common/Component";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
14
js/dist-typings/admin/components/LoadingModal.d.ts
vendored
Normal file
14
js/dist-typings/admin/components/LoadingModal.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||||
|
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
|
||||||
|
export interface ILoadingModalAttrs extends IInternalModalAttrs {
|
||||||
|
}
|
||||||
|
export default class LoadingModal<ModalAttrs extends ILoadingModalAttrs = ILoadingModalAttrs> extends Modal<ModalAttrs> {
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
static readonly isDismissible: boolean;
|
||||||
|
className(): string;
|
||||||
|
title(): import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
|
||||||
|
content(): string;
|
||||||
|
onsubmit(e: Event): void;
|
||||||
|
}
|
13
js/dist-typings/admin/components/MailPage.d.ts
vendored
Normal file
13
js/dist-typings/admin/components/MailPage.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
export default class MailPage extends AdminPage<import("../../common/components/Page").IPageAttrs> {
|
||||||
|
constructor();
|
||||||
|
sendingTest: boolean | undefined;
|
||||||
|
refresh(): void;
|
||||||
|
status: {
|
||||||
|
sending: boolean;
|
||||||
|
errors: {};
|
||||||
|
} | undefined;
|
||||||
|
driverFields: any;
|
||||||
|
sendTestEmail(): void;
|
||||||
|
testEmailSuccessAlert: number | undefined;
|
||||||
|
}
|
||||||
|
import AdminPage from "./AdminPage";
|
6
js/dist-typings/admin/components/PermissionDropdown.d.ts
vendored
Normal file
6
js/dist-typings/admin/components/PermissionDropdown.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export default class PermissionDropdown extends Dropdown {
|
||||||
|
save(groupIds: any): void;
|
||||||
|
toggle(groupId: any): void;
|
||||||
|
isGroupDisabled(id: any): boolean;
|
||||||
|
}
|
||||||
|
import Dropdown from "../../common/components/Dropdown";
|
36
js/dist-typings/admin/components/PermissionGrid.d.ts
vendored
Normal file
36
js/dist-typings/admin/components/PermissionGrid.d.ts
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import Component, { ComponentAttrs } from '../../common/Component';
|
||||||
|
import ItemList from '../../common/utils/ItemList';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
export interface PermissionConfig {
|
||||||
|
permission: string;
|
||||||
|
icon: string;
|
||||||
|
label: Mithril.Children;
|
||||||
|
allowGuest?: boolean;
|
||||||
|
}
|
||||||
|
export interface PermissionSetting {
|
||||||
|
setting: () => Mithril.Children;
|
||||||
|
icon: string;
|
||||||
|
label: Mithril.Children;
|
||||||
|
}
|
||||||
|
export declare type PermissionGridEntry = PermissionConfig | PermissionSetting;
|
||||||
|
export declare type PermissionType = 'view' | 'start' | 'reply' | 'moderate';
|
||||||
|
export interface ScopeItem {
|
||||||
|
label: Mithril.Children;
|
||||||
|
render: (permission: PermissionGridEntry) => Mithril.Children;
|
||||||
|
onremove?: () => void;
|
||||||
|
}
|
||||||
|
export interface IPermissionGridAttrs extends ComponentAttrs {
|
||||||
|
}
|
||||||
|
export default class PermissionGrid<CustomAttrs extends IPermissionGridAttrs = IPermissionGridAttrs> extends Component<CustomAttrs> {
|
||||||
|
view(vnode: Mithril.Vnode<CustomAttrs, this>): JSX.Element;
|
||||||
|
permissionItems(): ItemList<{
|
||||||
|
label: Mithril.Children;
|
||||||
|
children: PermissionGridEntry[];
|
||||||
|
}>;
|
||||||
|
viewItems(): ItemList<PermissionGridEntry>;
|
||||||
|
startItems(): ItemList<PermissionGridEntry>;
|
||||||
|
replyItems(): ItemList<PermissionGridEntry>;
|
||||||
|
moderateItems(): ItemList<PermissionGridEntry>;
|
||||||
|
scopeItems(): ItemList<ScopeItem>;
|
||||||
|
scopeControlItems(): ItemList<unknown>;
|
||||||
|
}
|
4
js/dist-typings/admin/components/PermissionsPage.d.ts
vendored
Normal file
4
js/dist-typings/admin/components/PermissionsPage.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export default class PermissionsPage extends AdminPage<import("../../common/components/Page").IPageAttrs> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import AdminPage from "./AdminPage";
|
18
js/dist-typings/admin/components/ReadmeModal.d.ts
vendored
Normal file
18
js/dist-typings/admin/components/ReadmeModal.d.ts
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||||
|
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
|
||||||
|
import ExtensionReadme from '../models/ExtensionReadme';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
import type { Extension } from '../AdminApplication';
|
||||||
|
export interface IReadmeModalAttrs extends IInternalModalAttrs {
|
||||||
|
extension: Extension;
|
||||||
|
}
|
||||||
|
export default class ReadmeModal<CustomAttrs extends IReadmeModalAttrs = IReadmeModalAttrs> extends Modal<CustomAttrs> {
|
||||||
|
protected name: string;
|
||||||
|
protected extName: string;
|
||||||
|
protected readme: ExtensionReadme;
|
||||||
|
oninit(vnode: Mithril.Vnode<CustomAttrs, this>): void;
|
||||||
|
className(): string;
|
||||||
|
title(): import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
|
||||||
|
content(): JSX.Element;
|
||||||
|
loadReadme(): Promise<void>;
|
||||||
|
}
|
14
js/dist-typings/admin/components/SessionDropdown.d.ts
vendored
Normal file
14
js/dist-typings/admin/components/SessionDropdown.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* The `SessionDropdown` component shows a button with the current user's
|
||||||
|
* avatar/name, with a dropdown of session controls.
|
||||||
|
*/
|
||||||
|
export default class SessionDropdown extends Dropdown {
|
||||||
|
/**
|
||||||
|
* Build an item list for the contents of the dropdown menu.
|
||||||
|
*
|
||||||
|
* @return {ItemList}
|
||||||
|
*/
|
||||||
|
items(): ItemList<any>;
|
||||||
|
}
|
||||||
|
import Dropdown from "../../common/components/Dropdown";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
3
js/dist-typings/admin/components/SettingDropdown.d.ts
vendored
Normal file
3
js/dist-typings/admin/components/SettingDropdown.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export default class SettingDropdown extends SelectDropdown {
|
||||||
|
}
|
||||||
|
import SelectDropdown from "../../common/components/SelectDropdown";
|
11
js/dist-typings/admin/components/SettingsModal.d.ts
vendored
Normal file
11
js/dist-typings/admin/components/SettingsModal.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
export default class SettingsModal extends Modal<import("../../common/components/Modal").IInternalModalAttrs> {
|
||||||
|
constructor();
|
||||||
|
settings: {} | undefined;
|
||||||
|
form(): string;
|
||||||
|
submitButton(): JSX.Element;
|
||||||
|
setting(key: any, fallback?: string): any;
|
||||||
|
dirty(): {};
|
||||||
|
changed(): number;
|
||||||
|
onsaved(): void;
|
||||||
|
}
|
||||||
|
import Modal from "../../common/components/Modal";
|
7
js/dist-typings/admin/components/StatusWidget.d.ts
vendored
Normal file
7
js/dist-typings/admin/components/StatusWidget.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export default class StatusWidget extends DashboardWidget {
|
||||||
|
items(): ItemList<any>;
|
||||||
|
toolsItems(): ItemList<any>;
|
||||||
|
handleClearCache(e: any): void;
|
||||||
|
}
|
||||||
|
import DashboardWidget from "./DashboardWidget";
|
||||||
|
import ItemList from "../../common/utils/ItemList";
|
28
js/dist-typings/admin/components/UploadImageButton.d.ts
vendored
Normal file
28
js/dist-typings/admin/components/UploadImageButton.d.ts
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
export default class UploadImageButton extends Button<import("../../common/components/Button").IButtonAttrs> {
|
||||||
|
constructor();
|
||||||
|
loading: boolean;
|
||||||
|
/**
|
||||||
|
* Prompt the user to upload an image.
|
||||||
|
*/
|
||||||
|
upload(): void;
|
||||||
|
/**
|
||||||
|
* Remove the logo.
|
||||||
|
*/
|
||||||
|
remove(): void;
|
||||||
|
resourceUrl(): string;
|
||||||
|
/**
|
||||||
|
* After a successful upload/removal, reload the page.
|
||||||
|
*
|
||||||
|
* @param {object} response
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected success(response: object): void;
|
||||||
|
/**
|
||||||
|
* If upload/removal fails, stop loading.
|
||||||
|
*
|
||||||
|
* @param {object} response
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected failure(response: object): void;
|
||||||
|
}
|
||||||
|
import Button from "../../common/components/Button";
|
85
js/dist-typings/admin/components/UserListPage.d.ts
vendored
Normal file
85
js/dist-typings/admin/components/UserListPage.d.ts
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
import type User from '../../common/models/User';
|
||||||
|
import ItemList from '../../common/utils/ItemList';
|
||||||
|
import AdminPage from './AdminPage';
|
||||||
|
declare type ColumnData = {
|
||||||
|
/**
|
||||||
|
* Column title
|
||||||
|
*/
|
||||||
|
name: Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Component(s) to show for this column.
|
||||||
|
*/
|
||||||
|
content: (user: User) => Mithril.Children;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* Admin page which displays a paginated list of all users on the forum.
|
||||||
|
*/
|
||||||
|
export default class UserListPage extends AdminPage {
|
||||||
|
/**
|
||||||
|
* Number of users to load per page.
|
||||||
|
*/
|
||||||
|
private numPerPage;
|
||||||
|
/**
|
||||||
|
* Current page number. Zero-indexed.
|
||||||
|
*/
|
||||||
|
private pageNumber;
|
||||||
|
/**
|
||||||
|
* Total number of forum users.
|
||||||
|
*
|
||||||
|
* Fetched from the active `AdminApplication` (`app`), with
|
||||||
|
* data provided by `AdminPayload.php`, or `flarum/statistics`
|
||||||
|
* if installed.
|
||||||
|
*/
|
||||||
|
readonly userCount: number;
|
||||||
|
/**
|
||||||
|
* Get total number of user pages.
|
||||||
|
*/
|
||||||
|
private getTotalPageCount;
|
||||||
|
/**
|
||||||
|
* This page's array of users.
|
||||||
|
*
|
||||||
|
* `undefined` when page loads as no data has been fetched.
|
||||||
|
*/
|
||||||
|
private pageData;
|
||||||
|
/**
|
||||||
|
* Are there more users available?
|
||||||
|
*/
|
||||||
|
private moreData;
|
||||||
|
private isLoadingPage;
|
||||||
|
/**
|
||||||
|
* Component to render.
|
||||||
|
*/
|
||||||
|
content(): JSX.Element[];
|
||||||
|
/**
|
||||||
|
* Build an item list of columns to show for each user.
|
||||||
|
*
|
||||||
|
* Each column in the list should be an object with keys `name` and `content`.
|
||||||
|
*
|
||||||
|
* `name` is a string that will be used as the column name.
|
||||||
|
* `content` is a function with the User model passed as the first and only argument.
|
||||||
|
*
|
||||||
|
* See `UserListPage.tsx` for examples.
|
||||||
|
*/
|
||||||
|
columns(): ItemList<ColumnData>;
|
||||||
|
headerInfo(): {
|
||||||
|
className: string;
|
||||||
|
icon: string;
|
||||||
|
title: import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
|
||||||
|
description: import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* Asynchronously fetch the next set of users to be rendered.
|
||||||
|
*
|
||||||
|
* Returns an array of Users, plus the raw API payload.
|
||||||
|
*
|
||||||
|
* Uses the `this.numPerPage` as the response limit, and automatically calculates the offset required from `pageNumber`.
|
||||||
|
*
|
||||||
|
* @param pageNumber The page number to load and display
|
||||||
|
*/
|
||||||
|
loadPage(pageNumber: number): Promise<void>;
|
||||||
|
nextPage(): void;
|
||||||
|
previousPage(): void;
|
||||||
|
}
|
||||||
|
export {};
|
3
js/dist-typings/admin/index.d.ts
vendored
Normal file
3
js/dist-typings/admin/index.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import app from './app';
|
||||||
|
export { app };
|
||||||
|
export declare const compat: Record<string, unknown>;
|
4
js/dist-typings/admin/models/ExtensionReadme.d.ts
vendored
Normal file
4
js/dist-typings/admin/models/ExtensionReadme.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export default class ExtensionReadme extends Model {
|
||||||
|
content: () => any;
|
||||||
|
}
|
||||||
|
import Model from "../../common/Model";
|
10
js/dist-typings/admin/resolvers/ExtensionPageResolver.d.ts
vendored
Normal file
10
js/dist-typings/admin/resolvers/ExtensionPageResolver.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import DefaultResolver from '../../common/resolvers/DefaultResolver';
|
||||||
|
import ExtensionPage, { ExtensionPageAttrs } from '../components/ExtensionPage';
|
||||||
|
/**
|
||||||
|
* A custom route resolver for ExtensionPage that generates handles routes
|
||||||
|
* to default extension pages or a page provided by an extension.
|
||||||
|
*/
|
||||||
|
export default class ExtensionPageResolver<Attrs extends ExtensionPageAttrs = ExtensionPageAttrs, RouteArgs extends Record<string, unknown> = {}> extends DefaultResolver<Attrs, ExtensionPage<Attrs>, RouteArgs> {
|
||||||
|
static extension: string | null;
|
||||||
|
onmatch(args: Attrs & RouteArgs, requestedPath: string, route: string): new () => ExtensionPage<Attrs>;
|
||||||
|
}
|
5
js/dist-typings/admin/routes.d.ts
vendored
Normal file
5
js/dist-typings/admin/routes.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import AdminApplication from './AdminApplication';
|
||||||
|
/**
|
||||||
|
* The `routes` initializer defines the forum app's routes.
|
||||||
|
*/
|
||||||
|
export default function (app: AdminApplication): void;
|
96
js/dist-typings/admin/utils/ExtensionData.d.ts
vendored
Normal file
96
js/dist-typings/admin/utils/ExtensionData.d.ts
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import type Mithril from 'mithril';
|
||||||
|
import ItemList from '../../common/utils/ItemList';
|
||||||
|
import { SettingsComponentOptions } from '../components/AdminPage';
|
||||||
|
import ExtensionPage, { ExtensionPageAttrs } from '../components/ExtensionPage';
|
||||||
|
import { PermissionConfig, PermissionType } from '../components/PermissionGrid';
|
||||||
|
declare type SettingConfigInput = SettingsComponentOptions | (() => Mithril.Children);
|
||||||
|
declare type SettingConfigInternal = SettingsComponentOptions | ((() => Mithril.Children) & {
|
||||||
|
setting: string;
|
||||||
|
});
|
||||||
|
export declare type CustomExtensionPage<Attrs extends ExtensionPageAttrs = ExtensionPageAttrs> = new () => ExtensionPage<Attrs>;
|
||||||
|
declare type ExtensionConfig = {
|
||||||
|
settings?: ItemList<SettingConfigInternal>;
|
||||||
|
permissions?: {
|
||||||
|
view?: ItemList<PermissionConfig>;
|
||||||
|
start?: ItemList<PermissionConfig>;
|
||||||
|
reply?: ItemList<PermissionConfig>;
|
||||||
|
moderate?: ItemList<PermissionConfig>;
|
||||||
|
};
|
||||||
|
page?: CustomExtensionPage;
|
||||||
|
};
|
||||||
|
declare type InnerDataNoActiveExtension = {
|
||||||
|
currentExtension: null;
|
||||||
|
data: {
|
||||||
|
[key: string]: ExtensionConfig | undefined;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
declare type InnerDataActiveExtension = {
|
||||||
|
currentExtension: string;
|
||||||
|
data: {
|
||||||
|
[key: string]: ExtensionConfig;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
export default class ExtensionData {
|
||||||
|
protected state: InnerDataActiveExtension | InnerDataNoActiveExtension;
|
||||||
|
/**
|
||||||
|
* This function simply takes the extension id
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* app.extensionData.for('flarum-tags')
|
||||||
|
*
|
||||||
|
* flarum/flags -> flarum-flags | acme/extension -> acme-extension
|
||||||
|
*/
|
||||||
|
for(extension: string): this;
|
||||||
|
/**
|
||||||
|
* This function registers your settings with Flarum
|
||||||
|
*
|
||||||
|
* It takes either a settings object or a callback.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* .registerSetting({
|
||||||
|
* setting: 'flarum-flags.guidelines_url',
|
||||||
|
* type: 'text', // This will be inputted into the input tag for the setting (text/number/etc)
|
||||||
|
* label: app.translator.trans('flarum-flags.admin.settings.guidelines_url_label')
|
||||||
|
* }, 15) // priority is optional (ItemList)
|
||||||
|
*/
|
||||||
|
registerSetting(content: SettingConfigInput, priority?: number): this;
|
||||||
|
/**
|
||||||
|
* This function registers your permission with Flarum
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* .registerPermission('permissions', {
|
||||||
|
* icon: 'fas fa-flag',
|
||||||
|
* label: app.translator.trans('flarum-flags.admin.permissions.view_flags_label'),
|
||||||
|
* permission: 'discussion.viewFlags'
|
||||||
|
* }, 'moderate', 65)
|
||||||
|
*/
|
||||||
|
registerPermission(content: PermissionConfig, permissionType: PermissionType, priority?: number): this;
|
||||||
|
/**
|
||||||
|
* Replace the default extension page with a custom component.
|
||||||
|
* This component would typically extend ExtensionPage
|
||||||
|
*/
|
||||||
|
registerPage(component: CustomExtensionPage): this;
|
||||||
|
/**
|
||||||
|
* Get an extension's registered settings
|
||||||
|
*/
|
||||||
|
getSettings(extensionId: string): SettingConfigInternal[] | undefined;
|
||||||
|
/**
|
||||||
|
* Get an ItemList of all extensions' registered permissions
|
||||||
|
*/
|
||||||
|
getAllExtensionPermissions(type: PermissionType): ItemList<PermissionConfig>;
|
||||||
|
/**
|
||||||
|
* Get a singular extension's registered permissions
|
||||||
|
*/
|
||||||
|
getExtensionPermissions(extension: string, type: PermissionType): ItemList<PermissionConfig>;
|
||||||
|
/**
|
||||||
|
* Checks whether a given extension has registered permissions.
|
||||||
|
*/
|
||||||
|
extensionHasPermissions(extension: string): boolean;
|
||||||
|
/**
|
||||||
|
* Returns an extension's custom page component if it exists.
|
||||||
|
*/
|
||||||
|
getPage<Attrs extends ExtensionPageAttrs = ExtensionPageAttrs>(extension: string): CustomExtensionPage<Attrs> | undefined;
|
||||||
|
}
|
||||||
|
export {};
|
1
js/dist-typings/admin/utils/generateElementId.d.ts
vendored
Normal file
1
js/dist-typings/admin/utils/generateElementId.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { nanoid as default } from 'nanoid';
|
1
js/dist-typings/admin/utils/getCategorizedExtensions.d.ts
vendored
Normal file
1
js/dist-typings/admin/utils/getCategorizedExtensions.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export default function getCategorizedExtensions(): {};
|
1
js/dist-typings/admin/utils/isExtensionEnabled.d.ts
vendored
Normal file
1
js/dist-typings/admin/utils/isExtensionEnabled.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export default function isExtensionEnabled(name: any): any;
|
1
js/dist-typings/admin/utils/saveSettings.d.ts
vendored
Normal file
1
js/dist-typings/admin/utils/saveSettings.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export default function saveSettings(settings: any): Promise<any>;
|
237
js/dist-typings/common/Application.d.ts
vendored
Normal file
237
js/dist-typings/common/Application.d.ts
vendored
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
import ItemList from './utils/ItemList';
|
||||||
|
import Translator from './Translator';
|
||||||
|
import Store, { ApiPayload, ApiResponsePlural, ApiResponseSingle } from './Store';
|
||||||
|
import Session from './Session';
|
||||||
|
import Drawer from './utils/Drawer';
|
||||||
|
import RequestError, { InternalFlarumRequestOptions } from './utils/RequestError';
|
||||||
|
import Forum from './models/Forum';
|
||||||
|
import PageState from './states/PageState';
|
||||||
|
import ModalManagerState from './states/ModalManagerState';
|
||||||
|
import AlertManagerState from './states/AlertManagerState';
|
||||||
|
import type DefaultResolver from './resolvers/DefaultResolver';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
import type Component from './Component';
|
||||||
|
import type { ComponentAttrs } from './Component';
|
||||||
|
import Model, { SavedModelData } from './Model';
|
||||||
|
export declare type FlarumScreens = 'phone' | 'tablet' | 'desktop' | 'desktop-hd';
|
||||||
|
export declare type FlarumGenericRoute = RouteItem<any, any, any>;
|
||||||
|
export interface FlarumRequestOptions<ResponseType> extends Omit<Mithril.RequestOptions<ResponseType>, 'extract'> {
|
||||||
|
errorHandler?: (error: RequestError) => void;
|
||||||
|
url: string;
|
||||||
|
/**
|
||||||
|
* Manipulate the response text before it is parsed into JSON.
|
||||||
|
*
|
||||||
|
* @deprecated Please use `modifyText` instead.
|
||||||
|
*/
|
||||||
|
extract?: (responseText: string) => string;
|
||||||
|
/**
|
||||||
|
* Manipulate the response text before it is parsed into JSON.
|
||||||
|
*
|
||||||
|
* This overrides any `extract` method provided.
|
||||||
|
*/
|
||||||
|
modifyText?: (responseText: string) => string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A valid route definition.
|
||||||
|
*/
|
||||||
|
export declare type RouteItem<Attrs extends ComponentAttrs, Comp extends Component<Attrs & {
|
||||||
|
routeName: string;
|
||||||
|
}>, RouteArgs extends Record<string, unknown> = {}> = {
|
||||||
|
/**
|
||||||
|
* The path for your route.
|
||||||
|
*
|
||||||
|
* This might be a specific URL path (e.g.,`/myPage`), or it might
|
||||||
|
* contain a variable used by a resolver (e.g., `/myPage/:id`).
|
||||||
|
*
|
||||||
|
* @see https://docs.flarum.org/extend/frontend-pages.html#route-resolvers-advanced
|
||||||
|
*/
|
||||||
|
path: `/${string}`;
|
||||||
|
} & ({
|
||||||
|
/**
|
||||||
|
* The component to render when this route matches.
|
||||||
|
*/
|
||||||
|
component: new () => Comp;
|
||||||
|
/**
|
||||||
|
* A custom resolver class.
|
||||||
|
*
|
||||||
|
* This should be the class itself, and **not** an instance of the
|
||||||
|
* class.
|
||||||
|
*/
|
||||||
|
resolverClass?: new (component: new () => Comp, routeName: string) => DefaultResolver<Attrs, Comp, RouteArgs>;
|
||||||
|
} | {
|
||||||
|
/**
|
||||||
|
* An instance of a route resolver.
|
||||||
|
*/
|
||||||
|
resolver: RouteResolver<Attrs, Comp, RouteArgs>;
|
||||||
|
});
|
||||||
|
export interface RouteResolver<Attrs extends ComponentAttrs, Comp extends Component<Attrs & {
|
||||||
|
routeName: string;
|
||||||
|
}>, RouteArgs extends Record<string, unknown> = {}> {
|
||||||
|
/**
|
||||||
|
* A method which selects which component to render based on
|
||||||
|
* conditional logic.
|
||||||
|
*
|
||||||
|
* Returns the component class, and **not** a Vnode or JSX
|
||||||
|
* expression.
|
||||||
|
*
|
||||||
|
* @see https://mithril.js.org/route.html#routeresolveronmatch
|
||||||
|
*/
|
||||||
|
onmatch(this: this, args: RouteArgs, requestedPath: string, route: string): {
|
||||||
|
new (): Comp;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* A function which renders the provided component.
|
||||||
|
*
|
||||||
|
* If not specified, the route will default to rendering the
|
||||||
|
* component on its own, inside of a fragment.
|
||||||
|
*
|
||||||
|
* Returns a Mithril Vnode or other children.
|
||||||
|
*
|
||||||
|
* @see https://mithril.js.org/route.html#routeresolverrender
|
||||||
|
*/
|
||||||
|
render?(this: this, vnode: Mithril.Vnode<Attrs, Comp>): Mithril.Children;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `App` class provides a container for an application, as well as various
|
||||||
|
* utilities for the rest of the app to use.
|
||||||
|
*/
|
||||||
|
export default class Application {
|
||||||
|
/**
|
||||||
|
* The forum model for this application.
|
||||||
|
*/
|
||||||
|
forum: Forum;
|
||||||
|
/**
|
||||||
|
* A map of routes, keyed by a unique route name. Each route is an object
|
||||||
|
* containing the following properties:
|
||||||
|
*
|
||||||
|
* - `path` The path that the route is accessed at.
|
||||||
|
* - `component` The Mithril component to render when this route is active.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* app.routes.discussion = { path: '/d/:id', component: DiscussionPage };
|
||||||
|
*/
|
||||||
|
routes: Record<string, FlarumGenericRoute>;
|
||||||
|
/**
|
||||||
|
* An ordered list of initializers to bootstrap the application.
|
||||||
|
*/
|
||||||
|
initializers: ItemList<(app: this) => void>;
|
||||||
|
/**
|
||||||
|
* The app's session.
|
||||||
|
*
|
||||||
|
* Stores info about the current user.
|
||||||
|
*/
|
||||||
|
session: Session;
|
||||||
|
/**
|
||||||
|
* The app's translator.
|
||||||
|
*/
|
||||||
|
translator: Translator;
|
||||||
|
/**
|
||||||
|
* The app's data store.
|
||||||
|
*/
|
||||||
|
store: Store;
|
||||||
|
/**
|
||||||
|
* A local cache that can be used to store data at the application level, so
|
||||||
|
* that is persists between different routes.
|
||||||
|
*/
|
||||||
|
cache: Record<string, unknown>;
|
||||||
|
/**
|
||||||
|
* Whether or not the app has been booted.
|
||||||
|
*/
|
||||||
|
booted: boolean;
|
||||||
|
/**
|
||||||
|
* The page the app is currently on.
|
||||||
|
*
|
||||||
|
* This object holds information about the type of page we are currently
|
||||||
|
* visiting, and sometimes additional arbitrary page state that may be
|
||||||
|
* relevant to lower-level components.
|
||||||
|
*/
|
||||||
|
current: PageState;
|
||||||
|
/**
|
||||||
|
* The page the app was on before the current page.
|
||||||
|
*
|
||||||
|
* Once the application navigates to another page, the object previously
|
||||||
|
* assigned to this.current will be moved to this.previous, while this.current
|
||||||
|
* is re-initialized.
|
||||||
|
*/
|
||||||
|
previous: PageState;
|
||||||
|
/**
|
||||||
|
* An object that manages modal state.
|
||||||
|
*/
|
||||||
|
modal: ModalManagerState;
|
||||||
|
/**
|
||||||
|
* An object that manages the state of active alerts.
|
||||||
|
*/
|
||||||
|
alerts: AlertManagerState;
|
||||||
|
/**
|
||||||
|
* An object that manages the state of the navigation drawer.
|
||||||
|
*/
|
||||||
|
drawer: Drawer;
|
||||||
|
data: {
|
||||||
|
apiDocument: ApiPayload | null;
|
||||||
|
locale: string;
|
||||||
|
locales: Record<string, string>;
|
||||||
|
resources: SavedModelData[];
|
||||||
|
session: {
|
||||||
|
userId: number;
|
||||||
|
csrfToken: string;
|
||||||
|
};
|
||||||
|
[key: string]: unknown;
|
||||||
|
};
|
||||||
|
private _title;
|
||||||
|
private _titleCount;
|
||||||
|
private set title(value);
|
||||||
|
get title(): string;
|
||||||
|
private set titleCount(value);
|
||||||
|
get titleCount(): number;
|
||||||
|
/**
|
||||||
|
* The key for an Alert that was shown as a result of an AJAX request error.
|
||||||
|
* If present, it will be dismissed on the next successful request.
|
||||||
|
*/
|
||||||
|
private requestErrorAlert;
|
||||||
|
initialRoute: string;
|
||||||
|
load(payload: Application['data']): void;
|
||||||
|
boot(): void;
|
||||||
|
bootExtensions(extensions: Record<string, {
|
||||||
|
extend?: unknown[];
|
||||||
|
}>): void;
|
||||||
|
protected mount(basePath?: string): void;
|
||||||
|
/**
|
||||||
|
* Get the API response document that has been preloaded into the application.
|
||||||
|
*/
|
||||||
|
preloadedApiDocument<M extends Model>(): ApiResponseSingle<M> | null;
|
||||||
|
preloadedApiDocument<Ms extends Model[]>(): ApiResponsePlural<Ms[number]> | null;
|
||||||
|
/**
|
||||||
|
* Determine the current screen mode, based on our media queries.
|
||||||
|
*/
|
||||||
|
screen(): FlarumScreens;
|
||||||
|
/**
|
||||||
|
* Set the `<title>` of the page.
|
||||||
|
*
|
||||||
|
* @param title New page title
|
||||||
|
*/
|
||||||
|
setTitle(title: string): void;
|
||||||
|
/**
|
||||||
|
* Set a number to display in the `<title>` of the page.
|
||||||
|
*
|
||||||
|
* @param count Number to display in title
|
||||||
|
*/
|
||||||
|
setTitleCount(count: number): void;
|
||||||
|
updateTitle(): void;
|
||||||
|
protected transformRequestOptions<ResponseType>(flarumOptions: FlarumRequestOptions<ResponseType>): InternalFlarumRequestOptions<ResponseType>;
|
||||||
|
/**
|
||||||
|
* Make an AJAX request, handling any low-level errors that may occur.
|
||||||
|
*
|
||||||
|
* @see https://mithril.js.org/request.html
|
||||||
|
*/
|
||||||
|
request<ResponseType>(originalOptions: FlarumRequestOptions<ResponseType>): Promise<ResponseType>;
|
||||||
|
/**
|
||||||
|
* By default, show an error alert, and log the error to the console.
|
||||||
|
*/
|
||||||
|
protected requestErrorCatch<ResponseType>(error: RequestError, customErrorHandler: FlarumRequestOptions<ResponseType>['errorHandler']): Promise<never>;
|
||||||
|
protected requestErrorDefaultHandler(e: unknown, isDebug: boolean, formattedErrors: string[]): void;
|
||||||
|
private showDebug;
|
||||||
|
/**
|
||||||
|
* Construct a URL to the route with the given name.
|
||||||
|
*/
|
||||||
|
route(name: string, params?: Record<string, unknown>): string;
|
||||||
|
}
|
114
js/dist-typings/common/Component.d.ts
vendored
Normal file
114
js/dist-typings/common/Component.d.ts
vendored
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
import type Mithril from 'mithril';
|
||||||
|
export interface ComponentAttrs extends Mithril.Attributes {
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `Component` class defines a user interface 'building block'. A component
|
||||||
|
* generates a virtual DOM to be rendered on each redraw.
|
||||||
|
*
|
||||||
|
* Essentially, this is a wrapper for Mithril's components that adds several useful features:
|
||||||
|
*
|
||||||
|
* - In the `oninit` and `onbeforeupdate` lifecycle hooks, we store vnode attrs in `this.attrs.
|
||||||
|
* This allows us to use attrs across components without having to pass the vnode to every single
|
||||||
|
* method.
|
||||||
|
* - The static `initAttrs` method allows a convenient way to provide defaults (or to otherwise modify)
|
||||||
|
* the attrs that have been passed into a component.
|
||||||
|
* - When the component is created in the DOM, we store its DOM element under `this.element`; this lets
|
||||||
|
* us use jQuery to modify child DOM state from internal methods via the `this.$()` method.
|
||||||
|
* - A convenience `component` method, which serves as an alternative to hyperscript and JSX.
|
||||||
|
*
|
||||||
|
* As with other Mithril components, components extending Component can be initialized
|
||||||
|
* and nested using JSX, hyperscript, or a combination of both. The `component` method can also
|
||||||
|
* be used.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* return m('div', <MyComponent foo="bar"><p>Hello World</p></MyComponent>);
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* return m('div', MyComponent.component({foo: 'bar'), m('p', 'Hello World!'));
|
||||||
|
*
|
||||||
|
* @see https://mithril.js.org/components.html
|
||||||
|
*/
|
||||||
|
export default abstract class Component<Attrs extends ComponentAttrs = ComponentAttrs, State = undefined> implements Mithril.ClassComponent<Attrs> {
|
||||||
|
/**
|
||||||
|
* The root DOM element for the component.
|
||||||
|
*/
|
||||||
|
protected element: Element;
|
||||||
|
/**
|
||||||
|
* The attributes passed into the component.
|
||||||
|
*
|
||||||
|
* @see https://mithril.js.org/components.html#passing-data-to-components
|
||||||
|
*/
|
||||||
|
protected attrs: Attrs;
|
||||||
|
/**
|
||||||
|
* Class component state that is persisted between redraws.
|
||||||
|
*
|
||||||
|
* Updating this will **not** automatically trigger a redraw, unlike
|
||||||
|
* other frameworks.
|
||||||
|
*
|
||||||
|
* This is different to Vnode state, which is always an instance of your
|
||||||
|
* class component.
|
||||||
|
*
|
||||||
|
* This is `undefined` by default.
|
||||||
|
*/
|
||||||
|
protected state: State;
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
abstract view(vnode: Mithril.Vnode<Attrs, this>): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
oninit(vnode: Mithril.Vnode<Attrs, this>): void;
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
oncreate(vnode: Mithril.VnodeDOM<Attrs, this>): void;
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
onbeforeupdate(vnode: Mithril.VnodeDOM<Attrs, this>): void;
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
onupdate(vnode: Mithril.VnodeDOM<Attrs, this>): void;
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
onbeforeremove(vnode: Mithril.VnodeDOM<Attrs, this>): void;
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
onremove(vnode: Mithril.VnodeDOM<Attrs, this>): void;
|
||||||
|
/**
|
||||||
|
* Returns a jQuery object for this component's element. If you pass in a
|
||||||
|
* selector string, this method will return a jQuery object, using the current
|
||||||
|
* element as its buffer.
|
||||||
|
*
|
||||||
|
* For example, calling `component.$('li')` will return a jQuery object
|
||||||
|
* containing all of the `li` elements inside the DOM element of this
|
||||||
|
* component.
|
||||||
|
*
|
||||||
|
* @param [selector] a jQuery-compatible selector string
|
||||||
|
* @returns the jQuery object for the DOM node
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
protected $(selector?: string): JQuery;
|
||||||
|
/**
|
||||||
|
* Convenience method to attach a component without JSX.
|
||||||
|
* Has the same effect as calling `m(THIS_CLASS, attrs, children)`.
|
||||||
|
*
|
||||||
|
* @see https://mithril.js.org/hyperscript.html#mselector,-attributes,-children
|
||||||
|
*/
|
||||||
|
static component<SAttrs extends ComponentAttrs = ComponentAttrs>(attrs?: SAttrs, children?: Mithril.Children): Mithril.Vnode;
|
||||||
|
/**
|
||||||
|
* Saves a reference to the vnode attrs after running them through initAttrs,
|
||||||
|
* and checking for common issues.
|
||||||
|
*/
|
||||||
|
private setAttrs;
|
||||||
|
/**
|
||||||
|
* Initialize the component's attrs.
|
||||||
|
*
|
||||||
|
* This can be used to assign default values for missing, optional attrs.
|
||||||
|
*/
|
||||||
|
protected static initAttrs<T>(attrs: T): void;
|
||||||
|
}
|
53
js/dist-typings/common/Fragment.d.ts
vendored
Normal file
53
js/dist-typings/common/Fragment.d.ts
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import type Mithril from 'mithril';
|
||||||
|
/**
|
||||||
|
* The `Fragment` class represents a chunk of DOM that is rendered once with Mithril and then takes
|
||||||
|
* over control of its own DOM and lifecycle.
|
||||||
|
*
|
||||||
|
* This is very similar to the `Component` wrapper class, but is used for more fine-grained control over
|
||||||
|
* the rendering and display of some significant chunks of the DOM. In contrast to components, fragments
|
||||||
|
* do not offer Mithril's lifecycle hooks.
|
||||||
|
*
|
||||||
|
* Use this when you want to enjoy the benefits of JSX / VDOM for initial rendering, combined with
|
||||||
|
* small helper methods that then make updates to that DOM directly, instead of fully redrawing
|
||||||
|
* everything through Mithril.
|
||||||
|
*
|
||||||
|
* This should only be used when necessary, and only with `m.render`. If you are unsure whether you need
|
||||||
|
* this or `Component, you probably need `Component`.
|
||||||
|
*/
|
||||||
|
export default abstract class Fragment {
|
||||||
|
/**
|
||||||
|
* The root DOM element for the fragment.
|
||||||
|
*/
|
||||||
|
protected element: Element;
|
||||||
|
/**
|
||||||
|
* Returns a jQuery object for this fragment's element. If you pass in a
|
||||||
|
* selector string, this method will return a jQuery object, using the current
|
||||||
|
* element as its buffer.
|
||||||
|
*
|
||||||
|
* For example, calling `fragment.$('li')` will return a jQuery object
|
||||||
|
* containing all of the `li` elements inside the DOM element of this
|
||||||
|
* fragment.
|
||||||
|
*
|
||||||
|
* @param [selector] a jQuery-compatible selector string
|
||||||
|
* @returns the jQuery object for the DOM node
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
$(selector?: string): JQuery;
|
||||||
|
/**
|
||||||
|
* Get the renderable virtual DOM that represents the fragment's view.
|
||||||
|
*
|
||||||
|
* This should NOT be overridden by subclasses. Subclasses wishing to define
|
||||||
|
* their virtual DOM should override Fragment#view instead.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const fragment = new MyFragment();
|
||||||
|
* m.render(document.body, fragment.render());
|
||||||
|
*
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
render(): Mithril.Vnode<Mithril.Attributes, this>;
|
||||||
|
/**
|
||||||
|
* Creates a view out of virtual elements.
|
||||||
|
*/
|
||||||
|
abstract view(): Mithril.Vnode<Mithril.Attributes, this>;
|
||||||
|
}
|
147
js/dist-typings/common/Model.d.ts
vendored
Normal file
147
js/dist-typings/common/Model.d.ts
vendored
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
import { FlarumRequestOptions } from './Application';
|
||||||
|
import Store, { ApiPayloadSingle, ApiResponseSingle, MetaInformation } from './Store';
|
||||||
|
export interface ModelIdentifier {
|
||||||
|
type: string;
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
export interface ModelAttributes {
|
||||||
|
[key: string]: unknown;
|
||||||
|
}
|
||||||
|
export interface ModelRelationships {
|
||||||
|
[relationship: string]: {
|
||||||
|
data: ModelIdentifier | ModelIdentifier[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export interface UnsavedModelData {
|
||||||
|
type?: string;
|
||||||
|
attributes?: ModelAttributes;
|
||||||
|
relationships?: ModelRelationships;
|
||||||
|
}
|
||||||
|
export interface SavedModelData {
|
||||||
|
type: string;
|
||||||
|
id: string;
|
||||||
|
attributes?: ModelAttributes;
|
||||||
|
relationships?: ModelRelationships;
|
||||||
|
}
|
||||||
|
export declare type ModelData = UnsavedModelData | SavedModelData;
|
||||||
|
export interface SaveRelationships {
|
||||||
|
[relationship: string]: Model | Model[];
|
||||||
|
}
|
||||||
|
export interface SaveAttributes {
|
||||||
|
[key: string]: unknown;
|
||||||
|
relationships?: SaveRelationships;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `Model` class represents a local data resource. It provides methods to
|
||||||
|
* persist changes via the API.
|
||||||
|
*/
|
||||||
|
export default abstract class Model {
|
||||||
|
/**
|
||||||
|
* The resource object from the API.
|
||||||
|
*/
|
||||||
|
data: ModelData;
|
||||||
|
/**
|
||||||
|
* The time at which the model's data was last updated. Watching the value
|
||||||
|
* of this property is a fast way to retain/cache a subtree if data hasn't
|
||||||
|
* changed.
|
||||||
|
*/
|
||||||
|
freshness: Date;
|
||||||
|
/**
|
||||||
|
* Whether or not the resource exists on the server.
|
||||||
|
*/
|
||||||
|
exists: boolean;
|
||||||
|
/**
|
||||||
|
* The data store that this resource should be persisted to.
|
||||||
|
*/
|
||||||
|
protected store: Store;
|
||||||
|
/**
|
||||||
|
* @param data A resource object from the API.
|
||||||
|
* @param store The data store that this model should be persisted to.
|
||||||
|
*/
|
||||||
|
constructor(data?: ModelData, store?: Store);
|
||||||
|
/**
|
||||||
|
* Get the model's ID.
|
||||||
|
*
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
id(): string | undefined;
|
||||||
|
/**
|
||||||
|
* Get one of the model's attributes.
|
||||||
|
*
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
attribute<T = unknown>(attribute: string): T;
|
||||||
|
/**
|
||||||
|
* Merge new data into this model locally.
|
||||||
|
*
|
||||||
|
* @param data A resource object to merge into this model
|
||||||
|
*/
|
||||||
|
pushData(data: ModelData | {
|
||||||
|
relationships?: SaveRelationships;
|
||||||
|
}): this;
|
||||||
|
/**
|
||||||
|
* Merge new attributes into this model locally.
|
||||||
|
*
|
||||||
|
* @param attributes The attributes to merge.
|
||||||
|
*/
|
||||||
|
pushAttributes(attributes: ModelAttributes): void;
|
||||||
|
/**
|
||||||
|
* Merge new attributes into this model, both locally and with persistence.
|
||||||
|
*
|
||||||
|
* @param attributes The attributes to save. If a 'relationships' key
|
||||||
|
* exists, it will be extracted and relationships will also be saved.
|
||||||
|
*/
|
||||||
|
save(attributes: SaveAttributes, options?: Omit<FlarumRequestOptions<ApiPayloadSingle>, 'url'> & {
|
||||||
|
meta?: MetaInformation;
|
||||||
|
}): Promise<ApiResponseSingle<this>>;
|
||||||
|
/**
|
||||||
|
* Send a request to delete the resource.
|
||||||
|
*
|
||||||
|
* @param body Data to send along with the DELETE request.
|
||||||
|
*/
|
||||||
|
delete(body?: FlarumRequestOptions<void>['body'], options?: Omit<FlarumRequestOptions<void>, 'url'>): Promise<void>;
|
||||||
|
/**
|
||||||
|
* Construct a path to the API endpoint for this resource.
|
||||||
|
*/
|
||||||
|
protected apiEndpoint(): string;
|
||||||
|
protected copyData(): ModelData;
|
||||||
|
protected rawRelationship<M extends Model>(relationship: string): undefined | ModelIdentifier;
|
||||||
|
protected rawRelationship<M extends Model[]>(relationship: string): undefined | ModelIdentifier[];
|
||||||
|
/**
|
||||||
|
* Generate a function which returns the value of the given attribute.
|
||||||
|
*
|
||||||
|
* @param transform A function to transform the attribute value
|
||||||
|
*/
|
||||||
|
static attribute<T>(name: string): () => T;
|
||||||
|
static attribute<T, O = unknown>(name: string, transform: (attr: O) => T): () => T;
|
||||||
|
/**
|
||||||
|
* Generate a function which returns the value of the given has-one
|
||||||
|
* relationship.
|
||||||
|
*
|
||||||
|
* @return false if no information about the
|
||||||
|
* relationship exists; undefined if the relationship exists but the model
|
||||||
|
* has not been loaded; or the model if it has been loaded.
|
||||||
|
*/
|
||||||
|
static hasOne<M extends Model>(name: string): () => M | false;
|
||||||
|
static hasOne<M extends Model | null>(name: string): () => M | null | false;
|
||||||
|
/**
|
||||||
|
* Generate a function which returns the value of the given has-many
|
||||||
|
* relationship.
|
||||||
|
*
|
||||||
|
* @return false if no information about the relationship
|
||||||
|
* exists; an array if it does, containing models if they have been
|
||||||
|
* loaded, and undefined for those that have not.
|
||||||
|
*/
|
||||||
|
static hasMany<M extends Model>(name: string): () => (M | undefined)[] | false;
|
||||||
|
/**
|
||||||
|
* Transform the given value into a Date object.
|
||||||
|
*/
|
||||||
|
static transformDate(value: string): Date;
|
||||||
|
static transformDate(value: string | null): Date | null;
|
||||||
|
static transformDate(value: string | undefined): Date | undefined;
|
||||||
|
static transformDate(value: string | null | undefined): Date | null | undefined;
|
||||||
|
/**
|
||||||
|
* Get a resource identifier object for the given model.
|
||||||
|
*/
|
||||||
|
protected static getIdentifier(model: Model): ModelIdentifier;
|
||||||
|
}
|
33
js/dist-typings/common/Session.d.ts
vendored
Normal file
33
js/dist-typings/common/Session.d.ts
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import User from './models/User';
|
||||||
|
import { FlarumRequestOptions } from './Application';
|
||||||
|
export declare type LoginParams = {
|
||||||
|
/**
|
||||||
|
* The username/email
|
||||||
|
*/
|
||||||
|
identification: string;
|
||||||
|
password: string;
|
||||||
|
remember: boolean;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* The `Session` class defines the current user session. It stores a reference
|
||||||
|
* to the current authenticated user, and provides methods to log in/out.
|
||||||
|
*/
|
||||||
|
export default class Session {
|
||||||
|
/**
|
||||||
|
* The current authenticated user.
|
||||||
|
*/
|
||||||
|
user: User | null;
|
||||||
|
/**
|
||||||
|
* The CSRF token.
|
||||||
|
*/
|
||||||
|
csrfToken: string;
|
||||||
|
constructor(user: User | null, csrfToken: string);
|
||||||
|
/**
|
||||||
|
* Attempt to log in a user.
|
||||||
|
*/
|
||||||
|
login(body: LoginParams, options?: Omit<FlarumRequestOptions<any>, 'url' | 'body' | 'method'>): Promise<any>;
|
||||||
|
/**
|
||||||
|
* Log the user out.
|
||||||
|
*/
|
||||||
|
logout(): void;
|
||||||
|
}
|
127
js/dist-typings/common/Store.d.ts
vendored
Normal file
127
js/dist-typings/common/Store.d.ts
vendored
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
import { FlarumRequestOptions } from './Application';
|
||||||
|
import Model, { ModelData, SavedModelData } from './Model';
|
||||||
|
export interface MetaInformation {
|
||||||
|
[key: string]: any;
|
||||||
|
}
|
||||||
|
export interface ApiQueryParamsSingle {
|
||||||
|
fields?: string[];
|
||||||
|
include?: string;
|
||||||
|
bySlug?: boolean;
|
||||||
|
meta?: MetaInformation;
|
||||||
|
}
|
||||||
|
export interface ApiQueryParamsPlural {
|
||||||
|
fields?: string[];
|
||||||
|
include?: string;
|
||||||
|
filter?: {
|
||||||
|
q: string;
|
||||||
|
[key: string]: string;
|
||||||
|
};
|
||||||
|
page?: {
|
||||||
|
offset?: number;
|
||||||
|
number?: number;
|
||||||
|
limit?: number;
|
||||||
|
size?: number;
|
||||||
|
};
|
||||||
|
sort?: string;
|
||||||
|
meta?: MetaInformation;
|
||||||
|
}
|
||||||
|
export declare type ApiQueryParams = ApiQueryParamsPlural | ApiQueryParamsSingle;
|
||||||
|
export interface ApiPayloadSingle {
|
||||||
|
data: SavedModelData;
|
||||||
|
included?: SavedModelData[];
|
||||||
|
meta?: MetaInformation;
|
||||||
|
}
|
||||||
|
export interface ApiPayloadPlural {
|
||||||
|
data: SavedModelData[];
|
||||||
|
included?: SavedModelData[];
|
||||||
|
links?: {
|
||||||
|
first: string;
|
||||||
|
next?: string;
|
||||||
|
prev?: string;
|
||||||
|
};
|
||||||
|
meta?: MetaInformation;
|
||||||
|
}
|
||||||
|
export declare type ApiPayload = ApiPayloadSingle | ApiPayloadPlural;
|
||||||
|
export declare type ApiResponseSingle<M extends Model> = M & {
|
||||||
|
payload: ApiPayloadSingle;
|
||||||
|
};
|
||||||
|
export declare type ApiResponsePlural<M extends Model> = M[] & {
|
||||||
|
payload: ApiPayloadPlural;
|
||||||
|
};
|
||||||
|
export declare type ApiResponse<M extends Model> = ApiResponseSingle<M> | ApiResponsePlural<M>;
|
||||||
|
interface ApiQueryRequestOptions<ResponseType> extends Omit<FlarumRequestOptions<ResponseType>, 'url'> {
|
||||||
|
}
|
||||||
|
interface StoreData {
|
||||||
|
[type: string]: Partial<Record<string, Model>>;
|
||||||
|
}
|
||||||
|
export declare function payloadIsPlural(payload: ApiPayload): payload is ApiPayloadPlural;
|
||||||
|
/**
|
||||||
|
* The `Store` class defines a local data store, and provides methods to
|
||||||
|
* retrieve data from the API.
|
||||||
|
*/
|
||||||
|
export default class Store {
|
||||||
|
/**
|
||||||
|
* The local data store. A tree of resource types to IDs, such that
|
||||||
|
* accessing data[type][id] will return the model for that type/ID.
|
||||||
|
*/
|
||||||
|
protected data: StoreData;
|
||||||
|
/**
|
||||||
|
* The model registry. A map of resource types to the model class that
|
||||||
|
* should be used to represent resources of that type.
|
||||||
|
*/
|
||||||
|
models: Record<string, typeof Model>;
|
||||||
|
constructor(models: Record<string, typeof Model>);
|
||||||
|
/**
|
||||||
|
* Push resources contained within an API payload into the store.
|
||||||
|
*
|
||||||
|
* @return The model(s) representing the resource(s) contained
|
||||||
|
* within the 'data' key of the payload.
|
||||||
|
*/
|
||||||
|
pushPayload<M extends Model>(payload: ApiPayloadSingle): ApiResponseSingle<M>;
|
||||||
|
pushPayload<Ms extends Model[]>(payload: ApiPayloadPlural): ApiResponsePlural<Ms[number]>;
|
||||||
|
/**
|
||||||
|
* Create a model to represent a resource object (or update an existing one),
|
||||||
|
* and push it into the store.
|
||||||
|
*
|
||||||
|
* @param data The resource object
|
||||||
|
* @return The model, or null if no model class has been
|
||||||
|
* registered for this resource type.
|
||||||
|
*/
|
||||||
|
pushObject<M extends Model>(data: SavedModelData): M | null;
|
||||||
|
pushObject<M extends Model>(data: SavedModelData, allowUnregistered: false): M;
|
||||||
|
/**
|
||||||
|
* Make a request to the API to find record(s) of a specific type.
|
||||||
|
*/
|
||||||
|
find<M extends Model>(type: string, params: ApiQueryParamsSingle): Promise<ApiResponseSingle<M>>;
|
||||||
|
find<Ms extends Model[]>(type: string, params: ApiQueryParamsPlural): Promise<ApiResponsePlural<Ms[number]>>;
|
||||||
|
find<M extends Model>(type: string, id: string, params?: ApiQueryParamsSingle, options?: ApiQueryRequestOptions<ApiPayloadSingle>): Promise<ApiResponseSingle<M>>;
|
||||||
|
find<Ms extends Model[]>(type: string, ids: string[], params?: ApiQueryParamsPlural, options?: ApiQueryRequestOptions<ApiPayloadPlural>): Promise<ApiResponsePlural<Ms[number]>>;
|
||||||
|
/**
|
||||||
|
* Get a record from the store by ID.
|
||||||
|
*/
|
||||||
|
getById<M extends Model>(type: string, id: string): M | undefined;
|
||||||
|
/**
|
||||||
|
* Get a record from the store by the value of a model attribute.
|
||||||
|
*
|
||||||
|
* @param type The resource type.
|
||||||
|
* @param key The name of the method on the model.
|
||||||
|
* @param value The value of the model attribute.
|
||||||
|
*/
|
||||||
|
getBy<M extends Model, T = unknown>(type: string, key: keyof M, value: T): M | undefined;
|
||||||
|
/**
|
||||||
|
* Get all loaded records of a specific type.
|
||||||
|
*/
|
||||||
|
all<M extends Model>(type: string): M[];
|
||||||
|
/**
|
||||||
|
* Remove the given model from the store.
|
||||||
|
*/
|
||||||
|
remove(model: Model): void;
|
||||||
|
/**
|
||||||
|
* Create a new record of the given type.
|
||||||
|
*
|
||||||
|
* @param type The resource type
|
||||||
|
* @param data Any data to initialize the model with
|
||||||
|
*/
|
||||||
|
createRecord<M extends Model>(type: string, data?: ModelData): M;
|
||||||
|
}
|
||||||
|
export {};
|
34
js/dist-typings/common/Translator.d.ts
vendored
Normal file
34
js/dist-typings/common/Translator.d.ts
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/// <reference path="../../src/common/translator-icu-rich.d.ts" />
|
||||||
|
import { RichMessageFormatter } from '@askvortsov/rich-icu-message-formatter';
|
||||||
|
import { pluralTypeHandler, selectTypeHandler } from '@ultraq/icu-message-formatter';
|
||||||
|
declare type Translations = Record<string, string>;
|
||||||
|
declare type TranslatorParameters = Record<string, unknown>;
|
||||||
|
export default class Translator {
|
||||||
|
/**
|
||||||
|
* A map of translation keys to their translated values.
|
||||||
|
*/
|
||||||
|
translations: Translations;
|
||||||
|
/**
|
||||||
|
* The underlying ICU MessageFormatter util.
|
||||||
|
*/
|
||||||
|
protected formatter: RichMessageFormatter;
|
||||||
|
setLocale(locale: string): void;
|
||||||
|
addTranslations(translations: Translations): void;
|
||||||
|
/**
|
||||||
|
* An extensible entrypoint for extenders to register type handlers for translations.
|
||||||
|
*/
|
||||||
|
protected formatterTypeHandlers(): {
|
||||||
|
plural: typeof pluralTypeHandler;
|
||||||
|
select: typeof selectTypeHandler;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* A temporary system to preprocess parameters.
|
||||||
|
* Should not be used by extensions.
|
||||||
|
* TODO: An extender will be added in v1.x.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected preprocessParameters(parameters: TranslatorParameters): TranslatorParameters;
|
||||||
|
trans(id: string, parameters?: TranslatorParameters): import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
|
||||||
|
}
|
||||||
|
export {};
|
6
js/dist-typings/common/app.d.ts
vendored
Normal file
6
js/dist-typings/common/app.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import type Application from './Application';
|
||||||
|
declare const _default: Application;
|
||||||
|
/**
|
||||||
|
* The instance of Application within the common namespace.
|
||||||
|
*/
|
||||||
|
export default _default;
|
174
js/dist-typings/common/compat.d.ts
vendored
Normal file
174
js/dist-typings/common/compat.d.ts
vendored
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
declare var _default: {
|
||||||
|
extend: any;
|
||||||
|
Session: typeof Session;
|
||||||
|
Store: typeof Store;
|
||||||
|
'utils/BasicEditorDriver': typeof BasicEditorDriver;
|
||||||
|
'utils/evented': {
|
||||||
|
handlers: Record<string, unknown>;
|
||||||
|
getHandlers(event: string): Function[];
|
||||||
|
trigger(event: string, ...args: any[]): void;
|
||||||
|
on(event: string, handler: Function): void;
|
||||||
|
one(event: string, handler: Function): void;
|
||||||
|
off(event: string, handler: Function): void;
|
||||||
|
};
|
||||||
|
'utils/liveHumanTimes': typeof liveHumanTimes;
|
||||||
|
'utils/ItemList': typeof ItemList;
|
||||||
|
'utils/mixin': typeof mixin;
|
||||||
|
'utils/humanTime': typeof humanTime;
|
||||||
|
'utils/computed': typeof computed;
|
||||||
|
'utils/insertText': typeof insertText;
|
||||||
|
'utils/styleSelectedText': typeof styleSelectedText;
|
||||||
|
'utils/Drawer': typeof Drawer;
|
||||||
|
'utils/anchorScroll': typeof anchorScroll;
|
||||||
|
'utils/RequestError': typeof RequestError;
|
||||||
|
'utils/abbreviateNumber': typeof abbreviateNumber;
|
||||||
|
'utils/string': typeof string;
|
||||||
|
'utils/SubtreeRetainer': typeof SubtreeRetainer;
|
||||||
|
'utils/escapeRegExp': typeof escapeRegExp;
|
||||||
|
'utils/extract': typeof extract;
|
||||||
|
'utils/ScrollListener': typeof ScrollListener;
|
||||||
|
'utils/stringToColor': typeof stringToColor;
|
||||||
|
'utils/Stream': typeof Stream;
|
||||||
|
'utils/subclassOf': typeof subclassOf;
|
||||||
|
'utils/setRouteWithForcedRefresh': typeof setRouteWithForcedRefresh;
|
||||||
|
'utils/patchMithril': typeof patchMithril;
|
||||||
|
'utils/proxifyCompat': typeof proxifyCompat;
|
||||||
|
'utils/classList': (...classes: import("clsx").ClassValue[]) => string;
|
||||||
|
'utils/extractText': typeof extractText;
|
||||||
|
'utils/formatNumber': typeof formatNumber;
|
||||||
|
'utils/mapRoutes': typeof mapRoutes;
|
||||||
|
'utils/withAttr': (key: string, cb: Function) => (this: Element) => void;
|
||||||
|
'utils/throttleDebounce': typeof ThrottleDebounce;
|
||||||
|
'utils/isObject': typeof isObject;
|
||||||
|
'utils/focusTrap': typeof FocusTrap;
|
||||||
|
'models/Notification': typeof Notification;
|
||||||
|
'models/User': typeof User;
|
||||||
|
'models/Post': typeof Post;
|
||||||
|
'models/Discussion': typeof Discussion;
|
||||||
|
'models/Group': typeof Group;
|
||||||
|
'models/Forum': typeof Forum;
|
||||||
|
Component: typeof Component;
|
||||||
|
Fragment: typeof Fragment;
|
||||||
|
Translator: typeof Translator;
|
||||||
|
'components/AlertManager': typeof AlertManager;
|
||||||
|
'components/Page': typeof Page;
|
||||||
|
'components/Switch': typeof Switch;
|
||||||
|
'components/Badge': typeof Badge;
|
||||||
|
'components/LoadingIndicator': typeof LoadingIndicator;
|
||||||
|
'components/Placeholder': typeof Placeholder;
|
||||||
|
'components/Separator': typeof Separator;
|
||||||
|
'components/Dropdown': typeof Dropdown;
|
||||||
|
'components/SplitDropdown': typeof SplitDropdown;
|
||||||
|
'components/RequestErrorModal': typeof RequestErrorModal;
|
||||||
|
'components/FieldSet': typeof FieldSet;
|
||||||
|
'components/Select': typeof Select;
|
||||||
|
'components/Navigation': typeof Navigation;
|
||||||
|
'components/Alert': typeof Alert;
|
||||||
|
'components/Link': typeof Link;
|
||||||
|
'components/LinkButton': typeof LinkButton;
|
||||||
|
'components/Checkbox': typeof Checkbox;
|
||||||
|
'components/ColorPreviewInput': typeof ColorPreviewInput;
|
||||||
|
'components/SelectDropdown': typeof SelectDropdown;
|
||||||
|
'components/ModalManager': typeof ModalManager;
|
||||||
|
'components/Button': typeof Button;
|
||||||
|
'components/Modal': typeof Modal;
|
||||||
|
'components/GroupBadge': typeof GroupBadge;
|
||||||
|
'components/TextEditor': typeof TextEditor;
|
||||||
|
'components/TextEditorButton': typeof TextEditorButton;
|
||||||
|
'components/Tooltip': typeof Tooltip;
|
||||||
|
'components/EditUserModal': typeof EditUserModal;
|
||||||
|
Model: typeof Model;
|
||||||
|
Application: typeof Application;
|
||||||
|
'helpers/fullTime': typeof fullTime;
|
||||||
|
'helpers/avatar': typeof avatar;
|
||||||
|
'helpers/icon': typeof icon;
|
||||||
|
'helpers/humanTime': typeof humanTimeHelper;
|
||||||
|
'helpers/punctuateSeries': typeof punctuateSeries;
|
||||||
|
'helpers/highlight': typeof highlight;
|
||||||
|
'helpers/username': typeof username;
|
||||||
|
'helpers/userOnline': typeof userOnline;
|
||||||
|
'helpers/listItems': typeof listItems;
|
||||||
|
'resolvers/DefaultResolver': typeof DefaultResolver;
|
||||||
|
'states/PaginatedListState': typeof PaginatedListState;
|
||||||
|
};
|
||||||
|
export default _default;
|
||||||
|
import Session from "./Session";
|
||||||
|
import Store from "./Store";
|
||||||
|
import BasicEditorDriver from "./utils/BasicEditorDriver";
|
||||||
|
import liveHumanTimes from "./utils/liveHumanTimes";
|
||||||
|
import ItemList from "./utils/ItemList";
|
||||||
|
import mixin from "./utils/mixin";
|
||||||
|
import humanTime from "./utils/humanTime";
|
||||||
|
import computed from "./utils/computed";
|
||||||
|
import insertText from "./utils/insertText";
|
||||||
|
import styleSelectedText from "./utils/styleSelectedText";
|
||||||
|
import Drawer from "./utils/Drawer";
|
||||||
|
import anchorScroll from "./utils/anchorScroll";
|
||||||
|
import RequestError from "./utils/RequestError";
|
||||||
|
import abbreviateNumber from "./utils/abbreviateNumber";
|
||||||
|
import * as string from "./utils/string";
|
||||||
|
import SubtreeRetainer from "./utils/SubtreeRetainer";
|
||||||
|
import escapeRegExp from "./utils/escapeRegExp";
|
||||||
|
import extract from "./utils/extract";
|
||||||
|
import ScrollListener from "./utils/ScrollListener";
|
||||||
|
import stringToColor from "./utils/stringToColor";
|
||||||
|
import Stream from "./utils/Stream";
|
||||||
|
import subclassOf from "./utils/subclassOf";
|
||||||
|
import setRouteWithForcedRefresh from "./utils/setRouteWithForcedRefresh";
|
||||||
|
import patchMithril from "./utils/patchMithril";
|
||||||
|
import proxifyCompat from "./utils/proxifyCompat";
|
||||||
|
import extractText from "./utils/extractText";
|
||||||
|
import formatNumber from "./utils/formatNumber";
|
||||||
|
import mapRoutes from "./utils/mapRoutes";
|
||||||
|
import * as ThrottleDebounce from "./utils/throttleDebounce";
|
||||||
|
import isObject from "./utils/isObject";
|
||||||
|
import * as FocusTrap from "./utils/focusTrap";
|
||||||
|
import Notification from "./models/Notification";
|
||||||
|
import User from "./models/User";
|
||||||
|
import Post from "./models/Post";
|
||||||
|
import Discussion from "./models/Discussion";
|
||||||
|
import Group from "./models/Group";
|
||||||
|
import Forum from "./models/Forum";
|
||||||
|
import Component from "./Component";
|
||||||
|
import Fragment from "./Fragment";
|
||||||
|
import Translator from "./Translator";
|
||||||
|
import AlertManager from "./components/AlertManager";
|
||||||
|
import Page from "./components/Page";
|
||||||
|
import Switch from "./components/Switch";
|
||||||
|
import Badge from "./components/Badge";
|
||||||
|
import LoadingIndicator from "./components/LoadingIndicator";
|
||||||
|
import Placeholder from "./components/Placeholder";
|
||||||
|
import Separator from "./components/Separator";
|
||||||
|
import Dropdown from "./components/Dropdown";
|
||||||
|
import SplitDropdown from "./components/SplitDropdown";
|
||||||
|
import RequestErrorModal from "./components/RequestErrorModal";
|
||||||
|
import FieldSet from "./components/FieldSet";
|
||||||
|
import Select from "./components/Select";
|
||||||
|
import Navigation from "./components/Navigation";
|
||||||
|
import Alert from "./components/Alert";
|
||||||
|
import Link from "./components/Link";
|
||||||
|
import LinkButton from "./components/LinkButton";
|
||||||
|
import Checkbox from "./components/Checkbox";
|
||||||
|
import ColorPreviewInput from "./components/ColorPreviewInput";
|
||||||
|
import SelectDropdown from "./components/SelectDropdown";
|
||||||
|
import ModalManager from "./components/ModalManager";
|
||||||
|
import Button from "./components/Button";
|
||||||
|
import Modal from "./components/Modal";
|
||||||
|
import GroupBadge from "./components/GroupBadge";
|
||||||
|
import TextEditor from "./components/TextEditor";
|
||||||
|
import TextEditorButton from "./components/TextEditorButton";
|
||||||
|
import Tooltip from "./components/Tooltip";
|
||||||
|
import EditUserModal from "./components/EditUserModal";
|
||||||
|
import Model from "./Model";
|
||||||
|
import Application from "./Application";
|
||||||
|
import fullTime from "./helpers/fullTime";
|
||||||
|
import avatar from "./helpers/avatar";
|
||||||
|
import icon from "./helpers/icon";
|
||||||
|
import humanTimeHelper from "./helpers/humanTime";
|
||||||
|
import punctuateSeries from "./helpers/punctuateSeries";
|
||||||
|
import highlight from "./helpers/highlight";
|
||||||
|
import username from "./helpers/username";
|
||||||
|
import userOnline from "./helpers/userOnline";
|
||||||
|
import listItems from "./helpers/listItems";
|
||||||
|
import DefaultResolver from "./resolvers/DefaultResolver";
|
||||||
|
import PaginatedListState from "./states/PaginatedListState";
|
19
js/dist-typings/common/components/Alert.d.ts
vendored
Normal file
19
js/dist-typings/common/components/Alert.d.ts
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import Component, { ComponentAttrs } from '../Component';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
export interface AlertAttrs extends ComponentAttrs {
|
||||||
|
/** The type of alert this is. Will be used to give the alert a class name of `Alert--{type}`. */
|
||||||
|
type?: string;
|
||||||
|
/** An array of controls to show in the alert. */
|
||||||
|
controls?: Mithril.Children;
|
||||||
|
/** Whether or not the alert can be dismissed. */
|
||||||
|
dismissible?: boolean;
|
||||||
|
/** A callback to run when the alert is dismissed */
|
||||||
|
ondismiss?: Function;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `Alert` component represents an alert box, which contains a message,
|
||||||
|
* some controls, and may be dismissible.
|
||||||
|
*/
|
||||||
|
export default class Alert<T extends AlertAttrs = AlertAttrs> extends Component<T> {
|
||||||
|
view(vnode: Mithril.VnodeDOM<T, this>): JSX.Element;
|
||||||
|
}
|
8
js/dist-typings/common/components/AlertManager.d.ts
vendored
Normal file
8
js/dist-typings/common/components/AlertManager.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* The `AlertManager` component provides an area in which `Alert` components can
|
||||||
|
* be shown and dismissed.
|
||||||
|
*/
|
||||||
|
export default class AlertManager extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
17
js/dist-typings/common/components/Badge.d.ts
vendored
Normal file
17
js/dist-typings/common/components/Badge.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* The `Badge` component represents a user/discussion badge, indicating some
|
||||||
|
* status (e.g. a discussion is stickied, a user is an admin).
|
||||||
|
*
|
||||||
|
* A badge may have the following special attrs:
|
||||||
|
*
|
||||||
|
* - `type` The type of badge this is. This will be used to give the badge a
|
||||||
|
* class name of `Badge--{type}`.
|
||||||
|
* - `icon` The name of an icon to show inside the badge.
|
||||||
|
* - `label`
|
||||||
|
*
|
||||||
|
* All other attrs will be assigned as attributes on the badge element.
|
||||||
|
*/
|
||||||
|
export default class Badge extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
69
js/dist-typings/common/components/Button.d.ts
vendored
Normal file
69
js/dist-typings/common/components/Button.d.ts
vendored
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import type Mithril from 'mithril';
|
||||||
|
import Component, { ComponentAttrs } from '../Component';
|
||||||
|
export interface IButtonAttrs extends ComponentAttrs {
|
||||||
|
/**
|
||||||
|
* Class(es) of an optional icon to be rendered within the button.
|
||||||
|
*
|
||||||
|
* If provided, the button will gain a `has-icon` class.
|
||||||
|
*/
|
||||||
|
icon?: string;
|
||||||
|
/**
|
||||||
|
* Disables button from user input.
|
||||||
|
*
|
||||||
|
* Default: `false`
|
||||||
|
*/
|
||||||
|
disabled?: boolean;
|
||||||
|
/**
|
||||||
|
* Show a loading spinner within the button.
|
||||||
|
*
|
||||||
|
* If `true`, also disables the button.
|
||||||
|
*
|
||||||
|
* Default: `false`
|
||||||
|
*/
|
||||||
|
loading?: boolean;
|
||||||
|
/**
|
||||||
|
* **DEPRECATED:** Please use the `aria-label` attribute instead. For tooltips, use
|
||||||
|
* the `<Tooltip>` component.
|
||||||
|
*
|
||||||
|
* Accessible text for the button. This should always be present if the button only
|
||||||
|
* contains an icon.
|
||||||
|
*
|
||||||
|
* The textual content of this attribute is passed to the DOM element as `aria-label`.
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
title?: string | Mithril.ChildArray;
|
||||||
|
/**
|
||||||
|
* Accessible text for the button. This should always be present if the button only
|
||||||
|
* contains an icon.
|
||||||
|
*
|
||||||
|
* The textual content of this attribute is passed to the DOM element as `aria-label`.
|
||||||
|
*/
|
||||||
|
'aria-label'?: string | Mithril.ChildArray;
|
||||||
|
/**
|
||||||
|
* Button type.
|
||||||
|
*
|
||||||
|
* Default: `"button"`
|
||||||
|
*
|
||||||
|
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-type
|
||||||
|
*/
|
||||||
|
type?: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `Button` component defines an element which, when clicked, performs an
|
||||||
|
* action.
|
||||||
|
*
|
||||||
|
* Other attrs will be assigned as attributes on the `<button>` element.
|
||||||
|
*
|
||||||
|
* Note that a Button has no default class names. This is because a Button can
|
||||||
|
* be used to represent any generic clickable control, like a menu item. Common
|
||||||
|
* styles can be applied by providing `className="Button"` to the Button component.
|
||||||
|
*/
|
||||||
|
export default class Button<CustomAttrs extends IButtonAttrs = IButtonAttrs> extends Component<CustomAttrs> {
|
||||||
|
view(vnode: Mithril.VnodeDOM<CustomAttrs, this>): JSX.Element;
|
||||||
|
oncreate(vnode: Mithril.VnodeDOM<CustomAttrs, this>): void;
|
||||||
|
/**
|
||||||
|
* Get the template for the button's content.
|
||||||
|
*/
|
||||||
|
protected getButtonContent(children: Mithril.Children): Mithril.ChildArray;
|
||||||
|
}
|
30
js/dist-typings/common/components/Checkbox.d.ts
vendored
Normal file
30
js/dist-typings/common/components/Checkbox.d.ts
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* The `Checkbox` component defines a checkbox input.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* - `state` Whether or not the checkbox is checked.
|
||||||
|
* - `className` The class name for the root element.
|
||||||
|
* - `disabled` Whether or not the checkbox is disabled.
|
||||||
|
* - `loading` Whether or not the checkbox is loading.
|
||||||
|
* - `onchange` A callback to run when the checkbox is checked/unchecked.
|
||||||
|
* - `children` A text label to display next to the checkbox.
|
||||||
|
*/
|
||||||
|
export default class Checkbox extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
/**
|
||||||
|
* Get the template for the checkbox's display (tick/cross icon).
|
||||||
|
*
|
||||||
|
* @return {import('mithril').Children}
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected getDisplay(): import('mithril').Children;
|
||||||
|
/**
|
||||||
|
* Run a callback when the state of the checkbox is changed.
|
||||||
|
*
|
||||||
|
* @param {boolean} checked
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected onchange(checked: boolean): void;
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
6
js/dist-typings/common/components/ColorPreviewInput.d.ts
vendored
Normal file
6
js/dist-typings/common/components/ColorPreviewInput.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import type Mithril from 'mithril';
|
||||||
|
import Component, { ComponentAttrs } from '../Component';
|
||||||
|
export default class ColorPreviewInput extends Component {
|
||||||
|
value?: string;
|
||||||
|
view(vnode: Mithril.Vnode<ComponentAttrs, this>): JSX.Element;
|
||||||
|
}
|
22
js/dist-typings/common/components/ConfirmDocumentUnload.d.ts
vendored
Normal file
22
js/dist-typings/common/components/ConfirmDocumentUnload.d.ts
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* The `ConfirmDocumentUnload` component can be used to register a global
|
||||||
|
* event handler that prevents closing the browser window/tab based on the
|
||||||
|
* return value of a given callback prop.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* - `when` - a callback returning true when the browser should prompt for
|
||||||
|
* confirmation before closing the window/tab
|
||||||
|
*
|
||||||
|
* ### Children
|
||||||
|
*
|
||||||
|
* NOTE: Only the first child will be rendered. (Use this component to wrap
|
||||||
|
* another component / DOM element.)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export default class ConfirmDocumentUnload extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
handler(): any;
|
||||||
|
boundHandler: (() => any) | undefined;
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
38
js/dist-typings/common/components/Dropdown.d.ts
vendored
Normal file
38
js/dist-typings/common/components/Dropdown.d.ts
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* The `Dropdown` component displays a button which, when clicked, shows a
|
||||||
|
* dropdown menu beneath it.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* - `buttonClassName` A class name to apply to the dropdown toggle button.
|
||||||
|
* - `menuClassName` A class name to apply to the dropdown menu.
|
||||||
|
* - `icon` The name of an icon to show in the dropdown toggle button.
|
||||||
|
* - `caretIcon` The name of an icon to show on the right of the button.
|
||||||
|
* - `label` The label of the dropdown toggle button. Defaults to 'Controls'.
|
||||||
|
* - `accessibleToggleLabel` The label used to describe the dropdown toggle button to assistive readers. Defaults to 'Toggle dropdown menu'.
|
||||||
|
* - `onhide`
|
||||||
|
* - `onshow`
|
||||||
|
*
|
||||||
|
* The children will be displayed as a list inside of the dropdown menu.
|
||||||
|
*/
|
||||||
|
export default class Dropdown extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
static initAttrs(attrs: any): void;
|
||||||
|
constructor();
|
||||||
|
showing: boolean | undefined;
|
||||||
|
/**
|
||||||
|
* Get the template for the button.
|
||||||
|
*
|
||||||
|
* @return {import('mithril').Children}
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected getButton(children: any): import('mithril').Children;
|
||||||
|
/**
|
||||||
|
* Get the template for the button's content.
|
||||||
|
*
|
||||||
|
* @return {import('mithril').Children}
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected getButtonContent(children: any): import('mithril').Children;
|
||||||
|
getMenu(items: any): JSX.Element;
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
31
js/dist-typings/common/components/EditUserModal.d.ts
vendored
Normal file
31
js/dist-typings/common/components/EditUserModal.d.ts
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||||
|
import Modal, { IInternalModalAttrs } from './Modal';
|
||||||
|
import ItemList from '../utils/ItemList';
|
||||||
|
import Stream from '../utils/Stream';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
import type User from '../models/User';
|
||||||
|
import type { SaveAttributes } from '../Model';
|
||||||
|
export interface IEditUserModalAttrs extends IInternalModalAttrs {
|
||||||
|
user: User;
|
||||||
|
}
|
||||||
|
export default class EditUserModal<CustomAttrs extends IEditUserModalAttrs = IEditUserModalAttrs> extends Modal<CustomAttrs> {
|
||||||
|
protected username: Stream<string>;
|
||||||
|
protected email: Stream<string>;
|
||||||
|
protected isEmailConfirmed: Stream<boolean>;
|
||||||
|
protected setPassword: Stream<boolean>;
|
||||||
|
protected password: Stream<string>;
|
||||||
|
protected groups: Record<string, Stream<boolean>>;
|
||||||
|
oninit(vnode: Mithril.Vnode<CustomAttrs, this>): void;
|
||||||
|
className(): string;
|
||||||
|
title(): import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
|
||||||
|
content(): JSX.Element;
|
||||||
|
fields(): ItemList<unknown>;
|
||||||
|
activate(): void;
|
||||||
|
data(): SaveAttributes;
|
||||||
|
onsubmit(e: SubmitEvent): void;
|
||||||
|
nonAdminEditingAdmin(): boolean | null;
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected userIsAdmin(user: User | null): boolean | null;
|
||||||
|
}
|
13
js/dist-typings/common/components/FieldSet.d.ts
vendored
Normal file
13
js/dist-typings/common/components/FieldSet.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* The `FieldSet` component defines a collection of fields, displayed in a list
|
||||||
|
* underneath a title. Accepted properties are:
|
||||||
|
*
|
||||||
|
* - `className` The class name for the fieldset.
|
||||||
|
* - `label` The title of this group of fields.
|
||||||
|
*
|
||||||
|
* The children should be an array of items to show in the fieldset.
|
||||||
|
*/
|
||||||
|
export default class FieldSet extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
4
js/dist-typings/common/components/GroupBadge.d.ts
vendored
Normal file
4
js/dist-typings/common/components/GroupBadge.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export default class GroupBadge extends Badge {
|
||||||
|
static initAttrs(attrs: any): void;
|
||||||
|
}
|
||||||
|
import Badge from "./Badge";
|
12
js/dist-typings/common/components/Link.d.ts
vendored
Normal file
12
js/dist-typings/common/components/Link.d.ts
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* The link component enables both internal and external links.
|
||||||
|
* It will return a regular HTML link for any links to external sites,
|
||||||
|
* and it will use Mithril's m.route.Link for any internal links.
|
||||||
|
*
|
||||||
|
* Links will default to internal; the 'external' attr must be set to
|
||||||
|
* `true` for the link to be external.
|
||||||
|
*/
|
||||||
|
export default class Link extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
25
js/dist-typings/common/components/LinkButton.d.ts
vendored
Normal file
25
js/dist-typings/common/components/LinkButton.d.ts
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* The `LinkButton` component defines a `Button` which links to a route.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* All of the attrs accepted by `Button`, plus:
|
||||||
|
*
|
||||||
|
* - `active` Whether or not the page that this button links to is currently
|
||||||
|
* active.
|
||||||
|
* - `href` The URL to link to. If the current URL `m.route()` matches this,
|
||||||
|
* the `active` prop will automatically be set to true.
|
||||||
|
* - `force` Whether the page should be fully rerendered. Defaults to `true`.
|
||||||
|
*/
|
||||||
|
export default class LinkButton extends Button<import("./Button").IButtonAttrs> {
|
||||||
|
static initAttrs(attrs: any): void;
|
||||||
|
/**
|
||||||
|
* Determine whether a component with the given attrs is 'active'.
|
||||||
|
*
|
||||||
|
* @param {object} attrs
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
static isActive(attrs: object): boolean;
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Button from "./Button";
|
56
js/dist-typings/common/components/LoadingIndicator.d.ts
vendored
Normal file
56
js/dist-typings/common/components/LoadingIndicator.d.ts
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/// <reference types="mithril" />
|
||||||
|
import Component, { ComponentAttrs } from '../Component';
|
||||||
|
export interface LoadingIndicatorAttrs extends ComponentAttrs {
|
||||||
|
/**
|
||||||
|
* Custom classes for the loading indicator's container.
|
||||||
|
*/
|
||||||
|
className?: string;
|
||||||
|
/**
|
||||||
|
* Custom classes for the loading indicator's container.
|
||||||
|
*/
|
||||||
|
containerClassName?: string;
|
||||||
|
/**
|
||||||
|
* Optional size for the loading indicator.
|
||||||
|
*/
|
||||||
|
size?: 'large' | 'medium' | 'small';
|
||||||
|
/**
|
||||||
|
* Optional attributes to apply to the loading indicator's container.
|
||||||
|
*/
|
||||||
|
containerAttrs?: Partial<ComponentAttrs>;
|
||||||
|
/**
|
||||||
|
* Display type of the spinner.
|
||||||
|
*
|
||||||
|
* @default 'block'
|
||||||
|
*/
|
||||||
|
display?: 'block' | 'inline' | 'unset';
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `LoadingIndicator` component displays a simple CSS-based loading spinner.
|
||||||
|
*
|
||||||
|
* To set a custom color, use the CSS `color` property.
|
||||||
|
*
|
||||||
|
* To increase spacing around the spinner, use the CSS `height` property on the
|
||||||
|
* spinner's **container**. Setting the `display` attribute to `block` will set
|
||||||
|
* a height of `100px` by default.
|
||||||
|
*
|
||||||
|
* To apply a custom size to the loading indicator, set the `--size` and
|
||||||
|
* `--thickness` CSS custom properties on the loading indicator container.
|
||||||
|
*
|
||||||
|
* If you *really* want to change how this looks as part of your custom theme,
|
||||||
|
* you can override the `border-radius` and `border` then set either a
|
||||||
|
* background image, or use `content: "\<glyph>"` (e.g. `content: "\f1ce"`)
|
||||||
|
* and `font-family: 'Font Awesome 5 Free'` to set an FA icon if you'd rather.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* - `containerClassName` Class name(s) to apply to the indicator's parent
|
||||||
|
* - `className` Class name(s) to apply to the indicator itself
|
||||||
|
* - `display` Determines how the spinner should be displayed (`inline`, `block` (default) or `unset`)
|
||||||
|
* - `size` Size of the loading indicator (`small`, `medium` or `large`)
|
||||||
|
* - `containerAttrs` Optional attrs to be applied to the container DOM element
|
||||||
|
*
|
||||||
|
* All other attrs will be assigned as attributes on the DOM element.
|
||||||
|
*/
|
||||||
|
export default class LoadingIndicator extends Component<LoadingIndicatorAttrs> {
|
||||||
|
view(): JSX.Element;
|
||||||
|
}
|
68
js/dist-typings/common/components/Modal.d.ts
vendored
Normal file
68
js/dist-typings/common/components/Modal.d.ts
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import Component from '../Component';
|
||||||
|
import { AlertAttrs } from './Alert';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
import type ModalManagerState from '../states/ModalManagerState';
|
||||||
|
import type RequestError from '../utils/RequestError';
|
||||||
|
import type ModalManager from './ModalManager';
|
||||||
|
export interface IInternalModalAttrs {
|
||||||
|
state: ModalManagerState;
|
||||||
|
animateShow: ModalManager['animateShow'];
|
||||||
|
animateHide: ModalManager['animateHide'];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `Modal` component displays a modal dialog, wrapped in a form. Subclasses
|
||||||
|
* should implement the `className`, `title`, and `content` methods.
|
||||||
|
*/
|
||||||
|
export default abstract class Modal<ModalAttrs extends IInternalModalAttrs = IInternalModalAttrs> extends Component<ModalAttrs> {
|
||||||
|
/**
|
||||||
|
* Determine whether or not the modal should be dismissible via an 'x' button.
|
||||||
|
*/
|
||||||
|
static readonly isDismissible: boolean;
|
||||||
|
protected loading: boolean;
|
||||||
|
/**
|
||||||
|
* Attributes for an alert component to show below the header.
|
||||||
|
*/
|
||||||
|
alertAttrs: AlertAttrs | null;
|
||||||
|
oninit(vnode: Mithril.Vnode<ModalAttrs, this>): void;
|
||||||
|
oncreate(vnode: Mithril.VnodeDOM<ModalAttrs, this>): void;
|
||||||
|
onbeforeremove(vnode: Mithril.VnodeDOM<ModalAttrs, this>): Promise<void> | void;
|
||||||
|
/**
|
||||||
|
* @todo split into FormModal and Modal in 2.0
|
||||||
|
*/
|
||||||
|
view(): JSX.Element;
|
||||||
|
/**
|
||||||
|
* Get the class name to apply to the modal.
|
||||||
|
*/
|
||||||
|
abstract className(): string;
|
||||||
|
/**
|
||||||
|
* Get the title of the modal dialog.
|
||||||
|
*/
|
||||||
|
abstract title(): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Get the content of the modal.
|
||||||
|
*/
|
||||||
|
abstract content(): Mithril.Children;
|
||||||
|
/**
|
||||||
|
* Handle the modal form's submit event.
|
||||||
|
*/
|
||||||
|
onsubmit(e: SubmitEvent): void;
|
||||||
|
/**
|
||||||
|
* Callback executed when the modal is shown and ready to be interacted with.
|
||||||
|
*
|
||||||
|
* @remark Focuses the first input in the modal.
|
||||||
|
*/
|
||||||
|
onready(): void;
|
||||||
|
/**
|
||||||
|
* Hides the modal.
|
||||||
|
*/
|
||||||
|
hide(): void;
|
||||||
|
/**
|
||||||
|
* Sets `loading` to false and triggers a redraw.
|
||||||
|
*/
|
||||||
|
loaded(): void;
|
||||||
|
/**
|
||||||
|
* Shows an alert describing an error returned from the API, and gives focus to
|
||||||
|
* the first relevant field involved in the error.
|
||||||
|
*/
|
||||||
|
onerror(error: RequestError): void;
|
||||||
|
}
|
25
js/dist-typings/common/components/ModalManager.d.ts
vendored
Normal file
25
js/dist-typings/common/components/ModalManager.d.ts
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import Component from '../Component';
|
||||||
|
import { FocusTrap } from '../utils/focusTrap';
|
||||||
|
import type ModalManagerState from '../states/ModalManagerState';
|
||||||
|
import type Mithril from 'mithril';
|
||||||
|
interface IModalManagerAttrs {
|
||||||
|
state: ModalManagerState;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `ModalManager` component manages a modal dialog. Only one modal dialog
|
||||||
|
* can be shown at once; loading a new component into the ModalManager will
|
||||||
|
* overwrite the previous one.
|
||||||
|
*/
|
||||||
|
export default class ModalManager extends Component<IModalManagerAttrs> {
|
||||||
|
protected focusTrap: FocusTrap | undefined;
|
||||||
|
/**
|
||||||
|
* Whether a modal is currently shown by this modal manager.
|
||||||
|
*/
|
||||||
|
protected modalShown: boolean;
|
||||||
|
view(vnode: Mithril.VnodeDOM<IModalManagerAttrs, this>): Mithril.Children;
|
||||||
|
oncreate(vnode: Mithril.VnodeDOM<IModalManagerAttrs, this>): void;
|
||||||
|
onupdate(vnode: Mithril.VnodeDOM<IModalManagerAttrs, this>): void;
|
||||||
|
animateShow(readyCallback: () => void): void;
|
||||||
|
animateHide(): void;
|
||||||
|
}
|
||||||
|
export {};
|
40
js/dist-typings/common/components/Navigation.d.ts
vendored
Normal file
40
js/dist-typings/common/components/Navigation.d.ts
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* The `Navigation` component displays a set of navigation buttons. Typically
|
||||||
|
* this is just a back button which pops the app's History. If the user is on
|
||||||
|
* the root page and there is no history to pop, then in some instances it may
|
||||||
|
* show a button that toggles the app's drawer.
|
||||||
|
*
|
||||||
|
* If the app has a pane, it will also include a 'pin' button which toggles the
|
||||||
|
* pinned state of the pane.
|
||||||
|
*
|
||||||
|
* Accepts the following attrs:
|
||||||
|
*
|
||||||
|
* - `className` The name of a class to set on the root element.
|
||||||
|
* - `drawer` Whether or not to show a button to toggle the app's drawer if
|
||||||
|
* there is no more history to pop.
|
||||||
|
*/
|
||||||
|
export default class Navigation extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
/**
|
||||||
|
* Get the back button.
|
||||||
|
*
|
||||||
|
* @return {import('mithril').Children}
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected getBackButton(): import('mithril').Children;
|
||||||
|
/**
|
||||||
|
* Get the pane pinned toggle button.
|
||||||
|
*
|
||||||
|
* @return {import('mithril').Children}
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected getPaneButton(): import('mithril').Children;
|
||||||
|
/**
|
||||||
|
* Get the drawer toggle button.
|
||||||
|
*
|
||||||
|
* @return {import('mithril').Children}
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected getDrawerButton(): import('mithril').Children;
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
28
js/dist-typings/common/components/Page.d.ts
vendored
Normal file
28
js/dist-typings/common/components/Page.d.ts
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import type Mithril from 'mithril';
|
||||||
|
import Component from '../Component';
|
||||||
|
export interface IPageAttrs {
|
||||||
|
key?: number;
|
||||||
|
routeName: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The `Page` component
|
||||||
|
*
|
||||||
|
* @abstract
|
||||||
|
*/
|
||||||
|
export default abstract class Page<CustomAttrs extends IPageAttrs = IPageAttrs> extends Component<CustomAttrs> {
|
||||||
|
/**
|
||||||
|
* A class name to apply to the body while the route is active.
|
||||||
|
*/
|
||||||
|
protected bodyClass: string;
|
||||||
|
/**
|
||||||
|
* Whether we should scroll to the top of the page when its rendered.
|
||||||
|
*/
|
||||||
|
protected scrollTopOnCreate: boolean;
|
||||||
|
/**
|
||||||
|
* Whether the browser should restore scroll state on refreshes.
|
||||||
|
*/
|
||||||
|
protected useBrowserScrollRestoration: boolean;
|
||||||
|
oninit(vnode: Mithril.Vnode<CustomAttrs, this>): void;
|
||||||
|
oncreate(vnode: Mithril.VnodeDOM<CustomAttrs, this>): void;
|
||||||
|
onremove(vnode: Mithril.VnodeDOM<CustomAttrs, this>): void;
|
||||||
|
}
|
12
js/dist-typings/common/components/Placeholder.d.ts
vendored
Normal file
12
js/dist-typings/common/components/Placeholder.d.ts
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* The `Placeholder` component displays a muted text with some call to action,
|
||||||
|
* usually used as an empty state.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* - `text`
|
||||||
|
*/
|
||||||
|
export default class Placeholder extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
12
js/dist-typings/common/components/RequestErrorModal.d.ts
vendored
Normal file
12
js/dist-typings/common/components/RequestErrorModal.d.ts
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/// <reference types="mithril" />
|
||||||
|
import type RequestError from '../utils/RequestError';
|
||||||
|
import Modal, { IInternalModalAttrs } from './Modal';
|
||||||
|
export interface IRequestErrorModalAttrs extends IInternalModalAttrs {
|
||||||
|
error: RequestError;
|
||||||
|
formattedError: string[];
|
||||||
|
}
|
||||||
|
export default class RequestErrorModal<CustomAttrs extends IRequestErrorModalAttrs = IRequestErrorModalAttrs> extends Modal<CustomAttrs> {
|
||||||
|
className(): string;
|
||||||
|
title(): string;
|
||||||
|
content(): JSX.Element;
|
||||||
|
}
|
16
js/dist-typings/common/components/Select.d.ts
vendored
Normal file
16
js/dist-typings/common/components/Select.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* The `Select` component displays a <select> input, surrounded with some extra
|
||||||
|
* elements for styling. It accepts the following attrs:
|
||||||
|
*
|
||||||
|
* - `options` A map of option values to labels.
|
||||||
|
* - `onchange` A callback to run when the selected value is changed.
|
||||||
|
* - `value` The value of the selected option.
|
||||||
|
* - `disabled` Disabled state for the input.
|
||||||
|
* - `wrapperAttrs` A map of attrs to be passed to the DOM element wrapping the `<select>`
|
||||||
|
*
|
||||||
|
* Other attributes are passed directly to the `<select>` element rendered to the DOM.
|
||||||
|
*/
|
||||||
|
export default class Select extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
13
js/dist-typings/common/components/SelectDropdown.d.ts
vendored
Normal file
13
js/dist-typings/common/components/SelectDropdown.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* The `SelectDropdown` component is the same as a `Dropdown`, except the toggle
|
||||||
|
* button's label is set as the label of the first child which has a truthy
|
||||||
|
* `active` prop.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* - `caretIcon`
|
||||||
|
* - `defaultLabel`
|
||||||
|
*/
|
||||||
|
export default class SelectDropdown extends Dropdown {
|
||||||
|
}
|
||||||
|
import Dropdown from "./Dropdown";
|
11
js/dist-typings/common/components/Separator.d.ts
vendored
Normal file
11
js/dist-typings/common/components/Separator.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
export default Separator;
|
||||||
|
/**
|
||||||
|
* The `Separator` component defines a menu separator item.
|
||||||
|
*/
|
||||||
|
declare class Separator extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
declare namespace Separator {
|
||||||
|
const isListItem: boolean;
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
16
js/dist-typings/common/components/SplitDropdown.d.ts
vendored
Normal file
16
js/dist-typings/common/components/SplitDropdown.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* The `SplitDropdown` component is similar to `Dropdown`, but the first child
|
||||||
|
* is displayed as its own button prior to the toggle button.
|
||||||
|
*/
|
||||||
|
export default class SplitDropdown extends Dropdown {
|
||||||
|
/**
|
||||||
|
* Get the first child. If the first child is an array, the first item in that
|
||||||
|
* array will be returned.
|
||||||
|
*
|
||||||
|
* @param {unknown[] | unknown} children
|
||||||
|
* @return {unknown}
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
protected getFirstChild(children: unknown[] | unknown): unknown;
|
||||||
|
}
|
||||||
|
import Dropdown from "./Dropdown";
|
8
js/dist-typings/common/components/Switch.d.ts
vendored
Normal file
8
js/dist-typings/common/components/Switch.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* The `Switch` component is a `Checkbox`, but with a switch display instead of
|
||||||
|
* a tick/cross one.
|
||||||
|
*/
|
||||||
|
export default class Switch extends Checkbox {
|
||||||
|
static initAttrs(attrs: any): void;
|
||||||
|
}
|
||||||
|
import Checkbox from "./Checkbox";
|
61
js/dist-typings/common/components/TextEditor.d.ts
vendored
Normal file
61
js/dist-typings/common/components/TextEditor.d.ts
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/**
|
||||||
|
* The `TextEditor` component displays a textarea with controls, including a
|
||||||
|
* submit button.
|
||||||
|
*
|
||||||
|
* ### Attrs
|
||||||
|
*
|
||||||
|
* - `composer`
|
||||||
|
* - `submitLabel`
|
||||||
|
* - `value`
|
||||||
|
* - `placeholder`
|
||||||
|
* - `disabled`
|
||||||
|
* - `preview`
|
||||||
|
*/
|
||||||
|
export default class TextEditor extends Component<import("../Component").ComponentAttrs, undefined> {
|
||||||
|
constructor();
|
||||||
|
/**
|
||||||
|
* The value of the editor.
|
||||||
|
*
|
||||||
|
* @type {String}
|
||||||
|
*/
|
||||||
|
value: string | undefined;
|
||||||
|
/**
|
||||||
|
* Whether the editor is disabled.
|
||||||
|
*/
|
||||||
|
disabled: any;
|
||||||
|
buildEditorParams(): {
|
||||||
|
classNames: string[];
|
||||||
|
disabled: any;
|
||||||
|
placeholder: any;
|
||||||
|
value: string | undefined;
|
||||||
|
oninput: (value: string) => void;
|
||||||
|
inputListeners: never[];
|
||||||
|
onsubmit: () => void;
|
||||||
|
};
|
||||||
|
buildEditor(dom: any): BasicEditorDriver;
|
||||||
|
/**
|
||||||
|
* Build an item list for the text editor controls.
|
||||||
|
*
|
||||||
|
* @return {ItemList<import('mithril').Children>}
|
||||||
|
*/
|
||||||
|
controlItems(): ItemList<import('mithril').Children>;
|
||||||
|
/**
|
||||||
|
* Build an item list for the toolbar controls.
|
||||||
|
*
|
||||||
|
* @return {ItemList<import('mithril').Children>}
|
||||||
|
*/
|
||||||
|
toolbarItems(): ItemList<import('mithril').Children>;
|
||||||
|
/**
|
||||||
|
* Handle input into the textarea.
|
||||||
|
*
|
||||||
|
* @param {string} value
|
||||||
|
*/
|
||||||
|
oninput(value: string): void;
|
||||||
|
/**
|
||||||
|
* Handle the submit button being clicked.
|
||||||
|
*/
|
||||||
|
onsubmit(): void;
|
||||||
|
}
|
||||||
|
import Component from "../Component";
|
||||||
|
import BasicEditorDriver from "../utils/BasicEditorDriver";
|
||||||
|
import ItemList from "../utils/ItemList";
|
14
js/dist-typings/common/components/TextEditorButton.d.ts
vendored
Normal file
14
js/dist-typings/common/components/TextEditorButton.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* The `TextEditorButton` component displays a button suitable for the text
|
||||||
|
* editor toolbar.
|
||||||
|
*
|
||||||
|
* Automatically creates tooltips using the Tooltip component and provided text.
|
||||||
|
*
|
||||||
|
* ## Attrs
|
||||||
|
* - `title` - Tooltip for the button
|
||||||
|
*/
|
||||||
|
export default class TextEditorButton extends Button<import("./Button").IButtonAttrs> {
|
||||||
|
static initAttrs(attrs: any): void;
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
import Button from "./Button";
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user