mirror of
https://github.com/flarum/core.git
synced 2025-09-02 04:33:04 +02:00
Compare commits
401 Commits
v0.1.0-bet
...
v0.1.0-bet
Author | SHA1 | Date | |
---|---|---|---|
|
2c02702d60 | ||
|
9c3a016123 | ||
|
e7c71ec445 | ||
|
0fba2c0c0a | ||
|
0666448ef5 | ||
|
08e40bc693 | ||
|
eaf1767008 | ||
|
9f1eca555f | ||
|
72fd32dbf6 | ||
|
d5ebbab3a7 | ||
|
17257aacaf | ||
|
f87c8c6dcd | ||
|
f9556d9d6a | ||
|
fdfc6c0de2 | ||
|
64e4132c92 | ||
|
4b78a3114f | ||
|
c01eea58b6 | ||
|
19cb74c856 | ||
|
27bcdb949b | ||
|
94fc460240 | ||
|
fc59f0fdd8 | ||
|
b91e903284 | ||
|
711e775de7 | ||
|
736e90d423 | ||
|
2f3d9995d1 | ||
|
ac14f84a9a | ||
|
1d7641cbb0 | ||
|
dce36cbeed | ||
|
7e1087cba5 | ||
|
8877bf97c4 | ||
|
7e74f5a03c | ||
|
02ceed4fed | ||
|
27f159f6b8 | ||
|
499f33fbb6 | ||
|
8dd3bd420b | ||
|
2ca3188eff | ||
|
f275bcdd2c | ||
|
64c702aaf7 | ||
|
833ea4e06e | ||
|
5643ee649b | ||
|
97b2db84c6 | ||
|
4fea25959c | ||
|
8b70cec6a1 | ||
|
a330a8fa28 | ||
|
02899d4f68 | ||
|
76f7d566b2 | ||
|
e296bbf0aa | ||
|
0a4ee93fde | ||
|
1e7fbf1ed9 | ||
|
1170d5c2cf | ||
|
fcbbedd884 | ||
|
4c89e2eb77 | ||
|
809f353c52 | ||
|
d7a5a6ad14 | ||
|
ca0c52d60a | ||
|
2325e33e38 | ||
|
aba291c542 | ||
|
9b00244454 | ||
|
c1878fe29b | ||
|
43c551929b | ||
|
840e740309 | ||
|
babb36d375 | ||
|
25b9d88469 | ||
|
b5c2285167 | ||
|
beaaa21f58 | ||
|
8a1bcf30d2 | ||
|
ff384569f8 | ||
|
f64a253450 | ||
|
da5628d125 | ||
|
a9c18c4753 | ||
|
d492579638 | ||
|
19188e3eda | ||
|
8cc44a695f | ||
|
7bb8b66596 | ||
|
40f709e7c6 | ||
|
264ff9f7bb | ||
|
308f2c9efd | ||
|
2a8ed53934 | ||
|
17c86b82bf | ||
|
63b039a800 | ||
|
213045aa03 | ||
|
6d10dbe9af | ||
|
4adf342ce3 | ||
|
b150636906 | ||
|
4f1adba387 | ||
|
879b801600 | ||
|
c712d23e9c | ||
|
d69c4035d9 | ||
|
b83adbccfd | ||
|
7b6c666e7b | ||
|
8b9f03e998 | ||
|
e69f8965c7 | ||
|
6d2b50722a | ||
|
99a05900b1 | ||
|
cc5e586d38 | ||
|
17074b8aab | ||
|
406c8ff834 | ||
|
1ba4a0b87e | ||
|
36017f89fe | ||
|
1f2566c32c | ||
|
0c74927eab | ||
|
19ecd968c6 | ||
|
fc64660f5d | ||
|
d5d769ebb1 | ||
|
f5ee37b394 | ||
|
54c5c09693 | ||
|
c87ebaef08 | ||
|
9c0d921f49 | ||
|
d7bdc173a4 | ||
|
937354512b | ||
|
2dedfe4b92 | ||
|
9f6ec80432 | ||
|
aa31b8307d | ||
|
dc06d5b5c9 | ||
|
2c867d2292 | ||
|
b09ac3f3f8 | ||
|
21f54c5562 | ||
|
a0ace316e8 | ||
|
6c96c932e0 | ||
|
522e41aa71 | ||
|
bbd891965f | ||
|
0f43445a90 | ||
|
7a684660e9 | ||
|
12dc4fff57 | ||
|
1b5a200781 | ||
|
1bdf7764a9 | ||
|
3417c0cbee | ||
|
738ca405fe | ||
|
09609a9f20 | ||
|
fb0a875c6d | ||
|
74b6b9935b | ||
|
3b5691ee28 | ||
|
18593e0d7d | ||
|
40e1b61fe6 | ||
|
95dcb45d65 | ||
|
bd989df769 | ||
|
538136153c | ||
|
c330662241 | ||
|
588cbaee2d | ||
|
a9557c399a | ||
|
14e7bc73ee | ||
|
edc579fa6f | ||
|
119831e51c | ||
|
2aee020c14 | ||
|
f20696210e | ||
|
ea84fc4836 | ||
|
5ff04d0c68 | ||
|
e2ec52c28c | ||
|
6196081bdf | ||
|
6d8e6583c8 | ||
|
c2b0060852 | ||
|
24964b94bf | ||
|
2b624c935d | ||
|
2e647cdda8 | ||
|
ba175144f4 | ||
|
e9af36ab47 | ||
|
8b3913339a | ||
|
3cced4156f | ||
|
e88a9394ed | ||
|
ba73c59601 | ||
|
0191babb05 | ||
|
ed51f9ff0a | ||
|
0a2bdbaa09 | ||
|
26229db1fd | ||
|
1aef3162be | ||
|
dcf88df0c7 | ||
|
3eb28dfb16 | ||
|
1d43371fa9 | ||
|
4df455cf04 | ||
|
2c43ccf66c | ||
|
1d010efbca | ||
|
2135d5908e | ||
|
9640dd6419 | ||
|
98464a8a33 | ||
|
2b6535525b | ||
|
b60617b849 | ||
|
0836d99e83 | ||
|
279c7df9b9 | ||
|
04bcf1eef6 | ||
|
70e98f810c | ||
|
3851d805f7 | ||
|
085468382a | ||
|
7dbdd8c024 | ||
|
ad25307e68 | ||
|
6c454b8279 | ||
|
9f15e9ba86 | ||
|
41009dba74 | ||
|
a045f8bef9 | ||
|
689d767f82 | ||
|
77fff9fde8 | ||
|
c6c1ae32e6 | ||
|
bdac88b573 | ||
|
31ee65be93 | ||
|
29df6b60be | ||
|
1e6f175379 | ||
|
065ff3456f | ||
|
37e0a5579b | ||
|
cd9aa0096e | ||
|
d06493c61e | ||
|
9f71e2c3cb | ||
|
81a8736ba9 | ||
|
57ce25301d | ||
|
cfbaa84fbc | ||
|
3417f5a77e | ||
|
1035636d0f | ||
|
d00fc2c49d | ||
|
f3b889a665 | ||
|
c5122bf5d5 | ||
|
5ed55195e1 | ||
|
8604ea3020 | ||
|
2648e960a7 | ||
|
f0dff95d62 | ||
|
894db01ad8 | ||
|
bd04023359 | ||
|
f357434a72 | ||
|
c2586586c4 | ||
|
06cd062a1b | ||
|
1502fc98d8 | ||
|
ed97989ca2 | ||
|
7f1048352d | ||
|
d2700961ba | ||
|
b2dbb0439c | ||
|
085c924a07 | ||
|
f31f02d4cc | ||
|
797f6eea50 | ||
|
9fb3a31b51 | ||
|
f8061bbca1 | ||
|
de67927ef2 | ||
|
8c841c3266 | ||
|
2f656146a7 | ||
|
d66d2aa26e | ||
|
f4c0d4ba87 | ||
|
646bd40bca | ||
|
307b912019 | ||
|
cbc896eba7 | ||
|
cc4e4a068b | ||
|
a720f6f651 | ||
|
54d7c0d3b6 | ||
|
b5876d9f31 | ||
|
25ef4c10bd | ||
|
985b87da6c | ||
|
a6aa28566c | ||
|
e3340ba3e1 | ||
|
590b311570 | ||
|
935a968257 | ||
|
fe558eb0ba | ||
|
fda9cba4ce | ||
|
89f6cfd949 | ||
|
803582c437 | ||
|
8e86d38804 | ||
|
fd66722945 | ||
|
ce42b5e035 | ||
|
bfd3a667dd | ||
|
b669490d33 | ||
|
ba956f51ac | ||
|
c126b95451 | ||
|
7f7484e790 | ||
|
5d64056e89 | ||
|
e927254e99 | ||
|
8061bfd74a | ||
|
4c309d2ad7 | ||
|
54876cfbd6 | ||
|
9e2b796a7c | ||
|
7f5bd1e96b | ||
|
5e1680c458 | ||
|
6e26b988bd | ||
|
2e8d4e4b6b | ||
|
14bede2847 | ||
|
54660ebd63 | ||
|
1a62b7e07a | ||
|
4b04c0e0ce | ||
|
4d45ce389b | ||
|
d2674fb309 | ||
|
5eb69e1f59 | ||
|
f42142979d | ||
|
5f79d3b499 | ||
|
8e4d97260f | ||
|
ee3640e160 | ||
|
bd584802e5 | ||
|
f4dd045326 | ||
|
24522943f6 | ||
|
56fde28e43 | ||
|
1c1d661bdd | ||
|
d3be186fb6 | ||
|
8f8cc558be | ||
|
5ea9e1cf5e | ||
|
99a6066f96 | ||
|
8b7db726dc | ||
|
7a44086bf3 | ||
|
12fdfc9b54 | ||
|
ecc3b5e227 | ||
|
bf2c5a5564 | ||
|
d3a5c91845 | ||
|
e17bb0b433 | ||
|
c4ba41f850 | ||
|
0c4de6f163 | ||
|
cd313952c7 | ||
|
ef57b443c1 | ||
|
5154d7e5a6 | ||
|
2bd40b50c7 | ||
|
c50d58d0f4 | ||
|
8c65316961 | ||
|
0a818cfdf3 | ||
|
57204c6ed0 | ||
|
a21052c903 | ||
|
441ebacfd7 | ||
|
46acfb6c23 | ||
|
9910e884fc | ||
|
d292aaabf8 | ||
|
d822a6f84c | ||
|
26c3bcdb74 | ||
|
33deea4791 | ||
|
20227a2201 | ||
|
0493682dba | ||
|
49dda87e86 | ||
|
d959d08561 | ||
|
e8ab49abc1 | ||
|
296677b5fc | ||
|
f3931b537c | ||
|
d0ba4e5268 | ||
|
654ab4cc29 | ||
|
e0becd0c7b | ||
|
ed43ad9c3f | ||
|
4611abe5db | ||
|
df0bd52283 | ||
|
d387a9ff02 | ||
|
5556df54f9 | ||
|
cf746079ed | ||
|
4d10536d35 | ||
|
ba16ebe61f | ||
|
6484dc4982 | ||
|
1a9f1f7a3d | ||
|
4d1411e2a8 | ||
|
968152b740 | ||
|
af185fd3d1 | ||
|
ed9591c16f | ||
|
8ad326941f | ||
|
8e4f02d994 | ||
|
8ae85bc49f | ||
|
7ff9a90204 | ||
|
f4fb1ab272 | ||
|
484c6d2edb | ||
|
8b68ff6232 | ||
|
0a59b7164e | ||
|
0879829dc4 | ||
|
78ba3bd854 | ||
|
44c91099cd | ||
|
4585f03ee3 | ||
|
bc9e8f68f1 | ||
|
f5a21584c2 | ||
|
e0a508a765 | ||
|
89e018a4f0 | ||
|
de6001f4cf | ||
|
790d5beee5 | ||
|
abf224bb0a | ||
|
c7d2e165d7 | ||
|
0ab9facc4b | ||
|
9b68bbe44e | ||
|
862404f052 | ||
|
b9a93f3440 | ||
|
c67fb2d4b6 | ||
|
1b2d4f1e1d | ||
|
54fdc40d87 | ||
|
390148456c | ||
|
167059027e | ||
|
208bad393f | ||
|
8a93f8b6b6 | ||
|
9db04a4e19 | ||
|
ac5e26a254 | ||
|
9794a08f39 | ||
|
ababb8ebef | ||
|
cb3baf9955 | ||
|
dbe8cba14e | ||
|
9fe671c9bb | ||
|
0e5f334a0b | ||
|
e4514d8413 | ||
|
1080d25561 | ||
|
ba594de13a | ||
|
209d13affd | ||
|
671fdec8d0 | ||
|
9eca9192ca | ||
|
3468bdf511 | ||
|
54503d2c29 | ||
|
565131e2a7 | ||
|
f0da3cf304 | ||
|
6acc91577d | ||
|
3e0cd3a21f | ||
|
5c9fa4c62d | ||
|
4b00f7996b | ||
|
b58380e224 | ||
|
b0e996e7ff | ||
|
b41d9fb0e7 | ||
|
ed02eed88f | ||
|
c761802900 | ||
|
16eb1fa63b | ||
|
0ceb8d64df | ||
|
9712eccb03 | ||
|
9684fbc4da | ||
|
67f9375d47 | ||
|
0d16fac001 | ||
|
a8f5ca8d97 |
BIN
.deploy.enc
BIN
.deploy.enc
Binary file not shown.
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
github: flarum
|
||||||
|
open_collective: flarum
|
||||||
|
tidelift: packagist/flarum/core
|
3
.github/ISSUE_TEMPLATE/bug-report.md
vendored
3
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -3,9 +3,6 @@ name: "🐛 Bug Report"
|
|||||||
about: "If something isn't working as expected"
|
about: "If something isn't working as expected"
|
||||||
|
|
||||||
---
|
---
|
||||||
<!--
|
|
||||||
IMPORTANT: If you discover a security vulnerability within Flarum, please send an email to [security@flarum.org](mailto:security@flarum.org) instead. We will address these with the utmost urgency and it will prevent vulnerabilities, which may be abused, from popping up on our issue tracker.
|
|
||||||
-->
|
|
||||||
## Bug Report
|
## Bug Report
|
||||||
|
|
||||||
**Current Behavior**
|
**Current Behavior**
|
||||||
|
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -16,7 +16,7 @@ IMPORTANT: We applaud pull requests, they excite us every single time. As we hav
|
|||||||
**Confirmed**
|
**Confirmed**
|
||||||
|
|
||||||
- [ ] Frontend changes: tested on a local Flarum installation.
|
- [ ] Frontend changes: tested on a local Flarum installation.
|
||||||
- [ ] Backend changes: tests are green (run `php vendor/bin/phpunit`).
|
- [ ] Backend changes: tests are green (run `composer test`).
|
||||||
|
|
||||||
**Required changes:**
|
**Required changes:**
|
||||||
|
|
||||||
|
13
.github/SECURITY.md
vendored
Normal file
13
.github/SECURITY.md
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# 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).
|
26
.github/stale.yml
vendored
Normal file
26
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
daysUntilStale: 90
|
||||||
|
daysUntilClose: 30
|
||||||
|
|
||||||
|
staleLabel: stale
|
||||||
|
|
||||||
|
exemptLabels:
|
||||||
|
- org/keep
|
||||||
|
- type/bug
|
||||||
|
- type/regression
|
||||||
|
- critical
|
||||||
|
- security
|
||||||
|
exemptAssignees: true
|
||||||
|
exemptMilestones: true
|
||||||
|
exemptProjects: true
|
||||||
|
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed if no further activity occurs. We do this
|
||||||
|
to keep the amount of open issues to a manageable minimum.
|
||||||
|
|
||||||
|
In any case, thanks for taking an interest in this software and contributing
|
||||||
|
by opening the issue in the first place!
|
||||||
|
|
||||||
|
closeComment: >
|
||||||
|
We are closing this issue as it seems to have grown stale. If you still
|
||||||
|
encounter this problem with the latest version, feel free to re-open it.
|
16
.github/workflows/build.yml
vendored
Normal file
16
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
name: JavaScript
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- uses: flarum/action-build@master
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
71
.github/workflows/test.yml
vendored
Normal file
71
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
name: Tests
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
php: [7.1, 7.2, 7.3, 7.4]
|
||||||
|
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.1
|
||||||
|
service: 'mysql:5.7'
|
||||||
|
prefix: flarum_
|
||||||
|
- php: 7.1
|
||||||
|
service: mariadb
|
||||||
|
prefix: flarum_
|
||||||
|
- php: 7.2
|
||||||
|
service: 'mysql:5.7'
|
||||||
|
prefix: flarum_
|
||||||
|
- php: 7.2
|
||||||
|
service: mariadb
|
||||||
|
prefix: flarum_
|
||||||
|
- php: 7.3
|
||||||
|
service: 'mysql:5.7'
|
||||||
|
prefix: flarum_
|
||||||
|
- php: 7.3
|
||||||
|
service: mariadb
|
||||||
|
prefix: flarum_
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: ${{ matrix.service }}
|
||||||
|
ports:
|
||||||
|
- 13306:3306
|
||||||
|
|
||||||
|
name: 'PHP ${{ matrix.php }} / ${{ matrix.db }} ${{ matrix.prefixStr }}'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
|
||||||
|
- name: Select PHP version
|
||||||
|
run: sudo update-alternatives --set php $(which php${{ matrix.php }})
|
||||||
|
|
||||||
|
- name: Create MySQL Database
|
||||||
|
run: mysql -uroot -proot -e 'CREATE DATABASE flarum_test;' --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
|
2
.gitignore
vendored
2
.gitignore
vendored
@@ -4,6 +4,6 @@ composer.phar
|
|||||||
node_modules
|
node_modules
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
/tests/tmp
|
/tests/integration/tmp
|
||||||
.vagrant
|
.vagrant
|
||||||
.idea/*
|
.idea/*
|
||||||
|
46
.travis.yml
46
.travis.yml
@@ -1,46 +0,0 @@
|
|||||||
language: php
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.composer/cache
|
|
||||||
- $HOME/.npm
|
|
||||||
|
|
||||||
install:
|
|
||||||
- composer install
|
|
||||||
- mysql -e 'CREATE DATABASE flarum;'
|
|
||||||
|
|
||||||
script:
|
|
||||||
- vendor/bin/phpunit --coverage-clover=coverage.xml
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
- php: 7.1
|
|
||||||
env: DB=mysql
|
|
||||||
|
|
||||||
- php: 7.2
|
|
||||||
env: DB=mysql
|
|
||||||
|
|
||||||
- php: 7.2
|
|
||||||
env: DB=mysql PREFIX=forum_
|
|
||||||
|
|
||||||
- php: 7.1
|
|
||||||
addons:
|
|
||||||
mariadb: '10.2'
|
|
||||||
env: DB=mariadb
|
|
||||||
|
|
||||||
- php: 7.2
|
|
||||||
addons:
|
|
||||||
mariadb: '10.2'
|
|
||||||
env: DB=mariadb
|
|
||||||
|
|
||||||
- stage: build
|
|
||||||
language: generic
|
|
||||||
if: branch = master AND type = push
|
|
||||||
install: skip
|
|
||||||
script: bash .travis/build.sh
|
|
||||||
-k $encrypted_678139e2bc67_key
|
|
||||||
-i $encrypted_678139e2bc67_iv
|
|
||||||
after_success: skip
|
|
@@ -1,33 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
main() {
|
|
||||||
while getopts ":k:i:" opt; do
|
|
||||||
case $opt in
|
|
||||||
k) encrypted_key="$OPTARG"
|
|
||||||
;;
|
|
||||||
i) encrypted_iv="$OPTARG"
|
|
||||||
;;
|
|
||||||
\?) echo "Invalid option -$OPTARG" >&2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
git checkout -f $TRAVIS_BRANCH
|
|
||||||
git config user.name "flarum-bot"
|
|
||||||
git config user.email "bot@flarum.org"
|
|
||||||
|
|
||||||
cd js
|
|
||||||
npm i -g npm@6.1.0
|
|
||||||
npm ci
|
|
||||||
npm run build
|
|
||||||
|
|
||||||
git add dist/* -f
|
|
||||||
git commit -m "Bundled output for commit $TRAVIS_COMMIT [skip ci]"
|
|
||||||
|
|
||||||
eval `ssh-agent -s`
|
|
||||||
openssl aes-256-cbc -K $encrypted_key -iv $encrypted_iv -in ../.deploy.enc -d | ssh-add -
|
|
||||||
|
|
||||||
git push git@github.com:$TRAVIS_REPO_SLUG.git $TRAVIS_BRANCH
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
132
CHANGELOG.md
132
CHANGELOG.md
@@ -1,12 +1,142 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.1.0-beta.12](https://github.com/flarum/core/compare/v0.1.0-beta.11.1...v0.1.0-beta.12)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Full support for PHP 7.4 (#1980)
|
||||||
|
- Mail settings: Configure region for the Mailgun driver (#1834, #1850)
|
||||||
|
- Mail settings: Alert admins about incomplete settings (#1763, #1921)
|
||||||
|
- New permission that allows users to post without throttling (#1255, #1938)
|
||||||
|
- Basic transliteration of discussion "slugs" / pretty URLs (#194, #1975)
|
||||||
|
- User profiles: Render basic content on server side (#1901)
|
||||||
|
- New extender for configuring middleware (#1919, #1952, #1957, #1971)
|
||||||
|
- New extender for configuring error handling (#1781, #1970)
|
||||||
|
- Automated tests for PHP extenders to guarantee their backwards compatibility
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Profile URLs for non-existing users properly return HTTP 404 (#1846, #1901)
|
||||||
|
- Confirmation email subject no longer contains the forum title (#1613)
|
||||||
|
- Improved error handling during Flarum's early boot phase (#1607)
|
||||||
|
- Updated deprecated "Zend" libraries to their new "Laminas" equivalents (#1963)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Update page did not work when installed in subdirectories (#1947)
|
||||||
|
- Avatar upload did not work in IE11 / Edge (#1125, #1570)
|
||||||
|
- Translation fallback was ignored for client-rendered pages (#1774, #1961)
|
||||||
|
- The success alert when posting replies was invisible (#1976)
|
||||||
|
|
||||||
|
## [0.1.0-beta.11.1](https://github.com/flarum/core/compare/v0.1.0-beta.11...v0.1.0-beta.11.1)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Saving custom css in admin failed (#1946)
|
||||||
|
|
||||||
|
## [0.1.0-beta.11](https://github.com/flarum/core/compare/v0.1.0-beta.10...v0.1.0-beta.11)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Comments have an additional class `Post--by-actor` when posted by the user (#1927)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Improved support for URL identification during installation (#1861)
|
||||||
|
- KeyboardNavigatable now has a callback ability (#1922)
|
||||||
|
- Links are no longer opened with target `_blank` but in the same window (#859)
|
||||||
|
- Links now have `nofollow ugc` by default as their `rel` attribute (#859, #1884)
|
||||||
|
- Improved performance of the full text gambit when searching for users (#1877)
|
||||||
|
- The Queue implementation is now available under its Illuminate contract
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- No error handling was possible in the console/cli (#1789)
|
||||||
|
- Enable scrollbars in log in modals so it fits for GitHub (#1716)
|
||||||
|
- Reduce log in modal for SSO so it fits for Facebook (#1727)
|
||||||
|
- Deleting discussions permanently did not delete its posts (#1909)
|
||||||
|
- Fixed the queue:restart command (#1932)
|
||||||
|
- Deleted posts were visible to all visitors (#1827)
|
||||||
|
- Old avatars weren't being deleted when replaced (#1918)
|
||||||
|
- The search performance regression was reverted (#1764)
|
||||||
|
- No profile background could be set for remote images (#445)
|
||||||
|
- Back button sends to home even though it could actually go back (#1942)
|
||||||
|
- Debug button no longer visible (#1687)
|
||||||
|
- Modals on smaller screens use the whole width of the page
|
||||||
|
|
||||||
|
## [0.1.0-beta.10](https://github.com/flarum/core/compare/v0.1.0-beta.9...v0.1.0-beta.10)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial queue support: Infrastructure for offloading long-running tasks (e.g. email sending) to background workers (#1773)
|
||||||
|
- Notifications can now be marked as read without visiting a discussion (#151)
|
||||||
|
- SEO: The discussion list now has a `rel="canonical"` meta tag, preventing duplicate content (#1134, #1814)
|
||||||
|
- The "Edit User" permission can now be edited in the UI (#1845)
|
||||||
|
- New status message and redirect after user deletion (#1750, #1777)
|
||||||
|
- Errors in Flarum's boot process are now presented with more detailed information (#1607)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Better, more detailed and extensible error handling (#1641, #1843)
|
||||||
|
- Error pages in debug mode now return the same HTTP status codes as in production (#1648)
|
||||||
|
- Tweak HTTP status codes for authentication / authorization errors (#1854)
|
||||||
|
- Already-used links from account activation emails now show a better error message (#1337)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Security vulnerabilities in dependencies
|
||||||
|
- Performance: High CPU usage when scrolling in a discussion (#1222)
|
||||||
|
- Special characters crashed the search (#1498)
|
||||||
|
- Missing declarations for language and text direction in HTML output (#1772)
|
||||||
|
- Private messages were counted in user post counts (#1695)
|
||||||
|
- Extensions could not change the forum's default page (#1819)
|
||||||
|
- API requests authenticated using access tokens needed to provide a CSRF token (#1828)
|
||||||
|
- Accessibility: Screenreaders did not read the "Back to discussion list" link (#1835)
|
||||||
|
|
||||||
|
## [0.1.0-beta.9](https://github.com/flarum/core/compare/v0.1.0-beta.8.2...v0.1.0-beta.9)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- New `hasPermission()` helper method for `Group` objects ([9684fbc](https://github.com/flarum/core/commit/9684fbc4da07d32aa322d9228302a23418412cb9))
|
||||||
|
- Expose supported mail drivers in IoC container ([208bad3](https://github.com/flarum/core/commit/208bad393f37bfdb76007afcddfa4b7451563e9d))
|
||||||
|
- More test for some API endpoints ([1670590](https://github.com/flarum/core/commit/167059027e5a066d618599c90164ef1b5a509148))
|
||||||
|
- The `Formatter\Rendering` event now receives the HTTP request instance as well ([0ab9fac](https://github.com/flarum/core/commit/0ab9facc4bd59a260575e6fc650793c663e5866a))
|
||||||
|
- More and better validation in installer UIs
|
||||||
|
- Check and enforce minimum MariaDB ([7ff9a90](https://github.com/flarum/core/commit/7ff9a90204923293adc520d3c02dc984845d4f9f))
|
||||||
|
- Revert publication of assets when installation fails ([ed9591c](https://github.com/flarum/core/commit/ed9591c16fb2ea7a4be3387b805d855a53e0a7d5))
|
||||||
|
- Benefit from Laravel's database reconnection logic in long-running tasks ([e0becd0](https://github.com/flarum/core/commit/e0becd0c7bda939048923c1f86648793feee78d5))
|
||||||
|
- The "vendor path" (where Composer dependencies can be found) can now be configured ([5e1680c](https://github.com/flarum/core/commit/5e1680c458cd3ba274faeb92de3ac2053789131e))
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Performance: Actually cache translations on disk ([0d16fac](https://github.com/flarum/core/commit/0d16fac001bb735ee66e82871183516aeac269b7))
|
||||||
|
- Allow per-site extenders to override extension extenders ([ba594de](https://github.com/flarum/core/commit/ba594de13a033480834d53d73f747b05fe9796f8))
|
||||||
|
- Do not resolve objects from the IoC container (in service providers and extenders) until they are actually used
|
||||||
|
- Replace event subscribers (that resolve objects from the IoC container) with listeners (that resolve lazily)
|
||||||
|
- Use custom service provider for Mail component ([ac5e26a](https://github.com/flarum/core/commit/ac5e26a254d89e21bd4c115b6cbd40338e2e4b4b))
|
||||||
|
- Update to Laravel 5.7, revert custom logic for building database index names
|
||||||
|
- Refactored installer, extracted Installation class and pipeline for reuse in CLI and web installers ([790d5be](https://github.com/flarum/core/commit/790d5beee5e283178716bc8f9901c758d9e5b6a0))
|
||||||
|
- Use whitelist for enabling pre-installed extensions during installation ([4585f03](https://github.com/flarum/core/commit/4585f03ee356c92942fbc2ae8c683c651b473954))
|
||||||
|
- Update minimum MySQL version ([7ff9a90](https://github.com/flarum/core/commit/7ff9a90204923293adc520d3c02dc984845d4f9f))
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Signing up via OAuth providers was broken ([67f9375](https://github.com/flarum/core/commit/67f9375d4745add194ae3249d526197c32fd5461))
|
||||||
|
- Group badges were overlapping ([16eb1fa](https://github.com/flarum/core/commit/16eb1fa63b6d7b80ec30c24c0e406a2b7ab09934))
|
||||||
|
- API: Endpoint for uninstalling extensions returned an error ([c761802](https://github.com/flarum/core/commit/c76180290056ddbab67baf5ede814fcedf1dcf14))
|
||||||
|
- Documentation links in installer were outdated ([b58380e](https://github.com/flarum/core/commit/b58380e224ee54abdade3d0a4cc107ef5c91c9a9))
|
||||||
|
- Event posts where counted when aggregating user posts ([671fdec](https://github.com/flarum/core/commit/671fdec8d0a092ccceb5d4d5f657d0f4287fc4c7))
|
||||||
|
- Admins could not reset user passwords ([c67fb2d](https://github.com/flarum/core/commit/c67fb2d4b6a128c71d65dc6703310c0b62f91be2))
|
||||||
|
- Several down migrations were invalid
|
||||||
|
- Validation errors on reset password page resulted in HTTP 404 ([4611abe](https://github.com/flarum/core/commit/4611abe5db8b94ca3dc7bf9c447fca7c67358ee3))
|
||||||
|
- `is:unread` gambit generated an invalid query ([e17bb0b](https://github.com/flarum/core/commit/e17bb0b4331f2c92459292195c6b7db8cde1f9f3))
|
||||||
|
- Entire forum was breaking when the `custom_less` setting was missing from the database ([bf2c5a5](https://github.com/flarum/core/commit/bf2c5a5564dff3f5ef13efe7a8d69f2617570ce6))
|
||||||
|
- Dropdown icon was not showing in user card when on user page ([12fdfc9](https://github.com/flarum/core/commit/12fdfc9b544a27f6fe59c82ad6bddd3420cc0181))
|
||||||
|
- Requests were missing the `original*` attributes, which broke installations in subfolders ([56fde28](https://github.com/flarum/core/commit/56fde28e436f52fee0c03c538f0a6049bc584b53))
|
||||||
|
- Special characters such as `%` and `_` could return incorrect results ([ee3640e](https://github.com/flarum/core/commit/ee3640e1605ff67fef4b3d5cd0596f14a6ae73c9))
|
||||||
|
- FontAwesome component package changed paths in version 5.9.0 ([5eb69e1](https://github.com/flarum/core/commit/5eb69e1f59fa73fdfd5badbf41a05a6a040e7426))
|
||||||
|
- Some server environments had problems accessing the system-wide tmp path for storing JS file maps ([54660eb](https://github.com/flarum/core/commit/54660ebd6311f9ea142f1b573263d0d907400786))
|
||||||
|
- Content length of posts.content was not migrated to mediumText in 2017 ([590b311](https://github.com/flarum/core/commit/590b3115708bf94a9c7f169d98c6126380c7056e))
|
||||||
|
- An error occurred when going to the previous route if there was no previous route found ([985b87da](https://github.com/flarum/core/commit/985b87da6c9942c568a1a192e2fdcfde72e030ee))
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- `php flarum install --defaults` - this was meant to be used in our old development VM ([44c9109](https://github.com/flarum/core/commit/44c91099cd77138bb5fc29f14fb1e81a9781272d))
|
||||||
|
- Obsolete `id` attributes in JSON-API responses ([ecc3b5e](https://github.com/flarum/core/commit/ecc3b5e2271f8d9b38d52cd54476d86995dbe32e) and [7a44086](https://github.com/flarum/core/commit/7a44086bf3a0e3ba907dceb13d07ac695eca05ea))
|
||||||
|
|
||||||
## [0.1.0-beta.8.1](https://github.com/flarum/core/compare/v0.1.0-beta.8...v0.1.0-beta.8.1)
|
## [0.1.0-beta.8.1](https://github.com/flarum/core/compare/v0.1.0-beta.8...v0.1.0-beta.8.1)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Fix live output in `migrate:reset` command ([f591585](https://github.com/flarum/core/commit/f591585d02f8c4ff0211c5bf4413dd6baa724c05))
|
- Fix live output in `migrate:reset` command ([f591585](https://github.com/flarum/core/commit/f591585d02f8c4ff0211c5bf4413dd6baa724c05))
|
||||||
- Fix search with database prefix ([7705a2b](https://github.com/flarum/core/commit/7705a2b7d751943ef9d0c7379ec34f8530b99310))
|
- Fix search with database prefix ([7705a2b](https://github.com/flarum/core/commit/7705a2b7d751943ef9d0c7379ec34f8530b99310))
|
||||||
- Fix invalid join time of admin user created by installer ([57f73c9](https://github.com/flarum/core/commit/57f73c9638eeb825f9e336ed3c443afccfd8995e))
|
- Fix invalid join time of admin user created by installer ([57f73c9](https://github.com/flarum/core/commit/57f73c9638eeb825f9e336ed3c443afccfd8995e))
|
||||||
- Ensure InnoDB engine is used for all tables ([fb6b51b](https://github.com/flarum/core/commit/fb6b51b1cfef0af399607fe038603c8240800b2b))
|
- Ensure InnoDB engine is used for all tables ([fb6b51b](https://github.com/flarum/core/commit/fb6b51b1cfef0af399607fe038603c8240800b2b), [6370f7e](https://github.com/flarum/core/commit/6370f7ecffa9ea7d5fb64d9551400edbc63318db))
|
||||||
- Fix dropping foreign keys in `down` migrations ([57d5846](https://github.com/flarum/core/commit/57d5846b647881009d9e60f9ffca20b1bb77776e))
|
- Fix dropping foreign keys in `down` migrations ([57d5846](https://github.com/flarum/core/commit/57d5846b647881009d9e60f9ffca20b1bb77776e))
|
||||||
- Fix discussion list scroll position not being maintained when hero is not visible ([40dc6ac](https://github.com/flarum/core/commit/40dc6ac604c2a0973356b38217aa8d09352daae5))
|
- Fix discussion list scroll position not being maintained when hero is not visible ([40dc6ac](https://github.com/flarum/core/commit/40dc6ac604c2a0973356b38217aa8d09352daae5))
|
||||||
- Fix empty meta description tag ([88e43cc](https://github.com/flarum/core/commit/88e43cc6940ee30d6529e9ce659471ec4fb1c474))
|
- Fix empty meta description tag ([88e43cc](https://github.com/flarum/core/commit/88e43cc6940ee30d6529e9ce659471ec4fb1c474))
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
# Contributing to Flarum
|
|
||||||
|
|
||||||
Thank you for considering contributing to Flarum! Please read the **[Contributing guide](https://flarum.org/docs/contributing.html)** to learn how you can help.
|
|
3
LICENSE
3
LICENSE
@@ -1,6 +1,7 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) Toby Zerner
|
Copyright (c) 2019-2020 Stichting Flarum (Flarum Foundation)
|
||||||
|
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
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@@ -27,7 +27,7 @@ Thank you for considering contributing to Flarum! Please read the **[Contributin
|
|||||||
|
|
||||||
## Security Vulnerabilities
|
## Security Vulnerabilities
|
||||||
|
|
||||||
If you discover a security vulnerability within Flarum, please send an e-mail to [security@flarum.org](mailto:security@flarum.org). All security vulnerabilities will be promptly addressed.
|
If you discover a security vulnerability within Flarum, please send an e-mail to [security@flarum.org](mailto:security@flarum.org). All security vulnerabilities will be promptly addressed. More details can be found in our [security policy](https://github.com/flarum/core/security/policy).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
@@ -5,13 +5,28 @@
|
|||||||
"homepage": "https://flarum.org/",
|
"homepage": "https://flarum.org/",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
|
||||||
"name": "Toby Zerner",
|
|
||||||
"email": "toby.zerner@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Franz Liedke",
|
"name": "Franz Liedke",
|
||||||
"email": "franz@develophp.org"
|
"email": "franz@develophp.org"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Daniel Klabbers",
|
||||||
|
"email": "daniel@klabbers.email",
|
||||||
|
"homepage": "https://luceos.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "David Sevilla Martin",
|
||||||
|
"email": "me+flarum@datitisev.me",
|
||||||
|
"homepage": "https://datitisev.me"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Clark Winkelmann",
|
||||||
|
"email": "clark.winkelmann@gmail.com",
|
||||||
|
"homepage": "https://clarkwinkelmann.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Matthew Kilgore",
|
||||||
|
"email": "matthew@kilgore.dev"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
@@ -22,25 +37,30 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1",
|
"php": ">=7.1",
|
||||||
"axy/sourcemap": "^0.1.4",
|
"axy/sourcemap": "^0.1.4",
|
||||||
"components/font-awesome": "^5.4.2",
|
"components/font-awesome": "5.9.*",
|
||||||
"dflydev/fig-cookies": "^1.0.2",
|
"dflydev/fig-cookies": "^1.0.2",
|
||||||
"doctrine/dbal": "^2.7",
|
"doctrine/dbal": "^2.7",
|
||||||
"franzl/whoops-middleware": "^0.4.0",
|
"franzl/whoops-middleware": "^0.4.0",
|
||||||
"illuminate/bus": "5.5.*",
|
"illuminate/bus": "5.7.*",
|
||||||
"illuminate/cache": "5.5.*",
|
"illuminate/cache": "5.7.*",
|
||||||
"illuminate/config": "5.5.*",
|
"illuminate/config": "5.7.*",
|
||||||
"illuminate/container": "5.5.*",
|
"illuminate/container": "5.7.*",
|
||||||
"illuminate/contracts": "5.5.*",
|
"illuminate/contracts": "5.7.*",
|
||||||
"illuminate/database": "5.5.*",
|
"illuminate/database": "5.7.*",
|
||||||
"illuminate/events": "5.5.*",
|
"illuminate/events": "5.7.*",
|
||||||
"illuminate/filesystem": "5.5.*",
|
"illuminate/filesystem": "5.7.*",
|
||||||
"illuminate/hashing": "5.5.*",
|
"illuminate/hashing": "5.7.*",
|
||||||
"illuminate/mail": "5.5.*",
|
"illuminate/mail": "5.7.*",
|
||||||
"illuminate/session": "5.5.*",
|
"illuminate/queue": "5.7.*",
|
||||||
"illuminate/support": "5.5.*",
|
"illuminate/session": "5.7.*",
|
||||||
"illuminate/validation": "5.5.*",
|
"illuminate/support": "5.7.*",
|
||||||
"illuminate/view": "5.5.*",
|
"illuminate/validation": "5.7.*",
|
||||||
|
"illuminate/view": "5.7.*",
|
||||||
"intervention/image": "^2.3.0",
|
"intervention/image": "^2.3.0",
|
||||||
|
"laminas/laminas-diactoros": "^1.8.4",
|
||||||
|
"laminas/laminas-httphandlerrunner": "^1.0",
|
||||||
|
"laminas/laminas-stratigility": "^3.0",
|
||||||
|
"laminas/laminas-zendframework-bridge": "^1.0",
|
||||||
"league/flysystem": "^1.0.11",
|
"league/flysystem": "^1.0.11",
|
||||||
"matthiasmullie/minify": "^1.3",
|
"matthiasmullie/minify": "^1.3",
|
||||||
"middlewares/base-path": "^1.1",
|
"middlewares/base-path": "^1.1",
|
||||||
@@ -48,24 +68,21 @@
|
|||||||
"middlewares/request-handler": "^1.2",
|
"middlewares/request-handler": "^1.2",
|
||||||
"monolog/monolog": "^1.16.0",
|
"monolog/monolog": "^1.16.0",
|
||||||
"nikic/fast-route": "^0.6",
|
"nikic/fast-route": "^0.6",
|
||||||
"oyejorge/less.php": "^1.7",
|
|
||||||
"psr/http-message": "^1.0",
|
"psr/http-message": "^1.0",
|
||||||
"psr/http-server-handler": "^1.0",
|
"psr/http-server-handler": "^1.0",
|
||||||
"psr/http-server-middleware": "^1.0",
|
"psr/http-server-middleware": "^1.0",
|
||||||
"s9e/text-formatter": "^1.2.0",
|
"s9e/text-formatter": "^2.3.6",
|
||||||
"symfony/config": "^3.3",
|
"symfony/config": "^3.3",
|
||||||
"symfony/console": "^3.3",
|
"symfony/console": "^4.2",
|
||||||
"symfony/http-foundation": "^3.3",
|
"symfony/event-dispatcher": "^4.3.2",
|
||||||
"symfony/translation": "^3.3",
|
"symfony/translation": "^3.3",
|
||||||
"symfony/yaml": "^3.3",
|
"symfony/yaml": "^3.3",
|
||||||
"tobscure/json-api": "^0.3.0",
|
"tobscure/json-api": "^0.3.0",
|
||||||
"zendframework/zend-diactoros": "^1.8.4",
|
"wikimedia/less.php": "^2.0"
|
||||||
"zendframework/zend-httphandlerrunner": "^1.0",
|
|
||||||
"zendframework/zend-stratigility": "^3.0"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"mockery/mockery": "^0.9.4",
|
"mockery/mockery": "^1.0",
|
||||||
"phpunit/phpunit": "^6.0"
|
"phpunit/phpunit": "^7.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@@ -87,5 +104,20 @@
|
|||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "0.1.x-dev"
|
"dev-master": "0.1.x-dev"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": [
|
||||||
|
"@test:unit",
|
||||||
|
"@test:integration"
|
||||||
|
],
|
||||||
|
"test:unit": "phpunit -c tests/phpunit.unit.xml",
|
||||||
|
"test:integration": "phpunit -c tests/phpunit.integration.xml",
|
||||||
|
"test:setup": "@php tests/integration/setup.php"
|
||||||
|
},
|
||||||
|
"scripts-descriptions": {
|
||||||
|
"test": "Runs all tests.",
|
||||||
|
"test:unit": "Runs all unit tests.",
|
||||||
|
"test:integration": "Runs all integration tests.",
|
||||||
|
"test:setup": "Sets up a database for use with integration tests. Execute this only once."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
30
js/dist/admin.js
vendored
30
js/dist/admin.js
vendored
File diff suppressed because one or more lines are too long
2
js/dist/admin.js.map
vendored
2
js/dist/admin.js.map
vendored
File diff suppressed because one or more lines are too long
32
js/dist/forum.js
vendored
32
js/dist/forum.js
vendored
File diff suppressed because one or more lines are too long
2
js/dist/forum.js.map
vendored
2
js/dist/forum.js.map
vendored
File diff suppressed because one or more lines are too long
1680
js/package-lock.json
generated
1680
js/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -2,20 +2,20 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"name": "@flarum/core",
|
"name": "@flarum/core",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bootstrap": "^3.3.7",
|
"bootstrap": "^3.4.1",
|
||||||
"classnames": "^2.2.5",
|
"classnames": "^2.2.5",
|
||||||
"color-thief-browser": "^2.0.2",
|
"color-thief-browser": "^2.0.2",
|
||||||
"expose-loader": "^0.7.5",
|
"expose-loader": "^0.7.5",
|
||||||
"flarum-webpack-config": "0.1.0-beta.10",
|
"flarum-webpack-config": "0.1.0-beta.10",
|
||||||
"jquery": "^3.3.1",
|
"jquery": "^3.4.1",
|
||||||
"jquery.hotkeys": "^0.1.0",
|
"jquery.hotkeys": "^0.1.0",
|
||||||
"lodash-es": "^4.17.11",
|
"lodash-es": "^4.17.14",
|
||||||
"m.attrs.bidi": "github:tobscure/m.attrs.bidi",
|
"m.attrs.bidi": "github:tobscure/m.attrs.bidi",
|
||||||
"mithril": "^0.2.8",
|
"mithril": "^0.2.8",
|
||||||
"moment": "^2.22.2",
|
"moment": "^2.22.2",
|
||||||
"punycode": "^2.1.1",
|
"punycode": "^2.1.1",
|
||||||
"spin.js": "^3.1.0",
|
"spin.js": "^3.1.0",
|
||||||
"webpack": "^4.26.0",
|
"webpack": "^4.41.2",
|
||||||
"webpack-cli": "^3.1.2",
|
"webpack-cli": "^3.1.2",
|
||||||
"webpack-merge": "^4.1.4"
|
"webpack-merge": "^4.1.4"
|
||||||
},
|
},
|
||||||
|
@@ -84,17 +84,21 @@ export default class EditGroupModal extends Modal {
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
submitData() {
|
||||||
|
return {
|
||||||
|
nameSingular: this.nameSingular(),
|
||||||
|
namePlural: this.namePlural(),
|
||||||
|
color: this.color(),
|
||||||
|
icon: this.icon()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
onsubmit(e) {
|
onsubmit(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
|
||||||
this.group.save({
|
this.group.save(this.submitData(), {errorHandler: this.onerror.bind(this)})
|
||||||
nameSingular: this.nameSingular(),
|
|
||||||
namePlural: this.namePlural(),
|
|
||||||
color: this.color(),
|
|
||||||
icon: this.icon()
|
|
||||||
}, {errorHandler: this.onerror.bind(this)})
|
|
||||||
.then(this.hide.bind(this))
|
.then(this.hide.bind(this))
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
|
@@ -2,36 +2,63 @@ import Page from './Page';
|
|||||||
import FieldSet from '../../common/components/FieldSet';
|
import FieldSet from '../../common/components/FieldSet';
|
||||||
import Button from '../../common/components/Button';
|
import Button from '../../common/components/Button';
|
||||||
import Alert from '../../common/components/Alert';
|
import Alert from '../../common/components/Alert';
|
||||||
|
import Select from '../../common/components/Select';
|
||||||
|
import LoadingIndicator from '../../common/components/LoadingIndicator';
|
||||||
import saveSettings from '../utils/saveSettings';
|
import saveSettings from '../utils/saveSettings';
|
||||||
|
|
||||||
export default class MailPage extends Page {
|
export default class MailPage extends Page {
|
||||||
init() {
|
init() {
|
||||||
super.init();
|
super.init();
|
||||||
|
|
||||||
this.loading = false;
|
this.saving = false;
|
||||||
|
this.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
this.fields = [
|
refresh() {
|
||||||
'mail_driver',
|
this.loading = true;
|
||||||
'mail_host',
|
|
||||||
'mail_from',
|
this.driverFields = {};
|
||||||
'mail_port',
|
this.fields = ['mail_driver', 'mail_from'];
|
||||||
'mail_username',
|
|
||||||
'mail_password',
|
|
||||||
'mail_encryption'
|
|
||||||
];
|
|
||||||
this.values = {};
|
this.values = {};
|
||||||
|
this.status = {sending: false, errors: {}};
|
||||||
|
|
||||||
const settings = app.data.settings;
|
const settings = app.data.settings;
|
||||||
this.fields.forEach(key => this.values[key] = m.prop(settings[key]));
|
this.fields.forEach(key => this.values[key] = m.prop(settings[key]));
|
||||||
|
|
||||||
this.localeOptions = {};
|
app.request({
|
||||||
const locales = app.locales;
|
method: 'GET',
|
||||||
for (const i in locales) {
|
url: app.forum.attribute('apiUrl') + '/mail-settings'
|
||||||
this.localeOptions[i] = `${locales[i]} (${i})`;
|
}).then(response => {
|
||||||
}
|
this.driverFields = response['data']['attributes']['fields'];
|
||||||
|
this.status.sending = response['data']['attributes']['sending'];
|
||||||
|
this.status.errors = response['data']['attributes']['errors'];
|
||||||
|
|
||||||
|
for (const driver in this.driverFields) {
|
||||||
|
for (const field in this.driverFields[driver]) {
|
||||||
|
this.fields.push(field);
|
||||||
|
this.values[field] = m.prop(settings[field]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.loading = false;
|
||||||
|
m.redraw();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
view() {
|
view() {
|
||||||
|
if (this.loading || this.saving) {
|
||||||
|
return (
|
||||||
|
<div className="MailPage">
|
||||||
|
<div className="container">
|
||||||
|
<LoadingIndicator />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fields = this.driverFields[this.values.mail_driver()];
|
||||||
|
const fieldKeys = Object.keys(fields);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="MailPage">
|
<div className="MailPage">
|
||||||
<div className="container">
|
<div className="container">
|
||||||
@@ -41,43 +68,49 @@ export default class MailPage extends Page {
|
|||||||
{app.translator.trans('core.admin.email.text')}
|
{app.translator.trans('core.admin.email.text')}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{FieldSet.component({
|
|
||||||
label: app.translator.trans('core.admin.email.server_heading'),
|
|
||||||
className: 'MailPage-MailSettings',
|
|
||||||
children: [
|
|
||||||
<div className="MailPage-MailSettings-input">
|
|
||||||
<label>{app.translator.trans('core.admin.email.driver_label')}</label>
|
|
||||||
<input className="FormControl" value={this.values.mail_driver() || ''} oninput={m.withAttr('value', this.values.mail_driver)} />
|
|
||||||
<label>{app.translator.trans('core.admin.email.host_label')}</label>
|
|
||||||
<input className="FormControl" value={this.values.mail_host() || ''} oninput={m.withAttr('value', this.values.mail_host)} />
|
|
||||||
<label>{app.translator.trans('core.admin.email.port_label')}</label>
|
|
||||||
<input className="FormControl" value={this.values.mail_port() || ''} oninput={m.withAttr('value', this.values.mail_port)} />
|
|
||||||
<label>{app.translator.trans('core.admin.email.encryption_label')}</label>
|
|
||||||
<input className="FormControl" value={this.values.mail_encryption() || ''} oninput={m.withAttr('value', this.values.mail_encryption)} />
|
|
||||||
</div>
|
|
||||||
]
|
|
||||||
})}
|
|
||||||
|
|
||||||
{FieldSet.component({
|
|
||||||
label: app.translator.trans('core.admin.email.account_heading'),
|
|
||||||
className: 'MailPage-MailSettings',
|
|
||||||
children: [
|
|
||||||
<div className="MailPage-MailSettings-input">
|
|
||||||
<label>{app.translator.trans('core.admin.email.username_label')}</label>
|
|
||||||
<input className="FormControl" value={this.values.mail_username() || ''} oninput={m.withAttr('value', this.values.mail_username)} />
|
|
||||||
<label>{app.translator.trans('core.admin.email.password_label')}</label>
|
|
||||||
<input className="FormControl" value={this.values.mail_password() || ''} oninput={m.withAttr('value', this.values.mail_password)} />
|
|
||||||
</div>
|
|
||||||
]
|
|
||||||
})}
|
|
||||||
|
|
||||||
{FieldSet.component({
|
{FieldSet.component({
|
||||||
label: app.translator.trans('core.admin.email.addresses_heading'),
|
label: app.translator.trans('core.admin.email.addresses_heading'),
|
||||||
className: 'MailPage-MailSettings',
|
className: 'MailPage-MailSettings',
|
||||||
children: [
|
children: [
|
||||||
<div className="MailPage-MailSettings-input">
|
<div className="MailPage-MailSettings-input">
|
||||||
<label>{app.translator.trans('core.admin.email.from_label')}</label>
|
<label>
|
||||||
<input className="FormControl" value={this.values.mail_from() || ''} oninput={m.withAttr('value', this.values.mail_from)} />
|
{app.translator.trans('core.admin.email.from_label')}
|
||||||
|
<input className="FormControl" value={this.values.mail_from() || ''} oninput={m.withAttr('value', this.values.mail_from)} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
]
|
||||||
|
})}
|
||||||
|
|
||||||
|
{FieldSet.component({
|
||||||
|
label: app.translator.trans('core.admin.email.driver_heading'),
|
||||||
|
className: 'MailPage-MailSettings',
|
||||||
|
children: [
|
||||||
|
<div className="MailPage-MailSettings-input">
|
||||||
|
<label>
|
||||||
|
{app.translator.trans('core.admin.email.driver_label')}
|
||||||
|
<Select value={this.values.mail_driver()} options={Object.keys(this.driverFields).reduce((memo, val) => ({...memo, [val]: val}), {})} onchange={this.values.mail_driver} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
]
|
||||||
|
})}
|
||||||
|
|
||||||
|
{this.status.sending || Alert.component({
|
||||||
|
children: app.translator.trans('core.admin.email.not_sending_message'),
|
||||||
|
dismissible: false,
|
||||||
|
})}
|
||||||
|
|
||||||
|
{fieldKeys.length > 0 && FieldSet.component({
|
||||||
|
label: app.translator.trans(`core.admin.email.${this.values.mail_driver()}_heading`),
|
||||||
|
className: 'MailPage-MailSettings',
|
||||||
|
children: [
|
||||||
|
<div className="MailPage-MailSettings-input">
|
||||||
|
{fieldKeys.map(field => [
|
||||||
|
<label>
|
||||||
|
{app.translator.trans(`core.admin.email.${field}_label`)}
|
||||||
|
{this.renderField(field)}
|
||||||
|
</label>,
|
||||||
|
this.status.errors[field] && <p className='ValidationError'>{this.status.errors[field]}</p>,
|
||||||
|
])}
|
||||||
</div>
|
</div>
|
||||||
]
|
]
|
||||||
})}
|
})}
|
||||||
@@ -86,7 +119,6 @@ export default class MailPage extends Page {
|
|||||||
type: 'submit',
|
type: 'submit',
|
||||||
className: 'Button Button--primary',
|
className: 'Button Button--primary',
|
||||||
children: app.translator.trans('core.admin.email.submit_button'),
|
children: app.translator.trans('core.admin.email.submit_button'),
|
||||||
loading: this.loading,
|
|
||||||
disabled: !this.changed()
|
disabled: !this.changed()
|
||||||
})}
|
})}
|
||||||
</form>
|
</form>
|
||||||
@@ -95,6 +127,18 @@ export default class MailPage extends Page {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderField(name) {
|
||||||
|
const driver = this.values.mail_driver();
|
||||||
|
const field = this.driverFields[driver][name];
|
||||||
|
const prop = this.values[name];
|
||||||
|
|
||||||
|
if (typeof field === 'string') {
|
||||||
|
return <input className="FormControl" value={prop() || ''} oninput={m.withAttr('value', prop)} />;
|
||||||
|
} else {
|
||||||
|
return <Select value={prop()} options={field} onchange={prop} />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
changed() {
|
changed() {
|
||||||
return this.fields.some(key => this.values[key]() !== app.data.settings[key]);
|
return this.fields.some(key => this.values[key]() !== app.data.settings[key]);
|
||||||
}
|
}
|
||||||
@@ -102,9 +146,9 @@ export default class MailPage extends Page {
|
|||||||
onsubmit(e) {
|
onsubmit(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
if (this.loading) return;
|
if (this.saving) return;
|
||||||
|
|
||||||
this.loading = true;
|
this.saving = true;
|
||||||
app.alerts.dismiss(this.successAlert);
|
app.alerts.dismiss(this.successAlert);
|
||||||
|
|
||||||
const settings = {};
|
const settings = {};
|
||||||
@@ -117,8 +161,8 @@ export default class MailPage extends Page {
|
|||||||
})
|
})
|
||||||
.catch(() => {})
|
.catch(() => {})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.loading = false;
|
this.saving = false;
|
||||||
m.redraw();
|
this.refresh();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -210,6 +210,12 @@ export default class PermissionGrid extends Component {
|
|||||||
permission: 'discussion.delete'
|
permission: 'discussion.delete'
|
||||||
}, 80);
|
}, 80);
|
||||||
|
|
||||||
|
items.add('postWithoutThrottle', {
|
||||||
|
icon: 'fas fa-swimmer',
|
||||||
|
label: app.translator.trans('core.admin.permissions.post_without_throttle_label'),
|
||||||
|
permission: 'postWithoutThrottle'
|
||||||
|
}, 70);
|
||||||
|
|
||||||
items.add('editPosts', {
|
items.add('editPosts', {
|
||||||
icon: 'fas fa-pencil-alt',
|
icon: 'fas fa-pencil-alt',
|
||||||
label: app.translator.trans('core.admin.permissions.edit_posts_label'),
|
label: app.translator.trans('core.admin.permissions.edit_posts_label'),
|
||||||
@@ -228,6 +234,12 @@ export default class PermissionGrid extends Component {
|
|||||||
permission: 'discussion.deletePosts'
|
permission: 'discussion.deletePosts'
|
||||||
}, 60);
|
}, 60);
|
||||||
|
|
||||||
|
items.add('userEdit', {
|
||||||
|
icon: 'fas fa-user-cog',
|
||||||
|
label: app.translator.trans('core.admin.permissions.edit_users_label'),
|
||||||
|
permission: 'user.edit'
|
||||||
|
}, 60);
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,9 @@
|
|||||||
import ItemList from './utils/ItemList';
|
import ItemList from './utils/ItemList';
|
||||||
import Alert from './components/Alert';
|
import Alert from './components/Alert';
|
||||||
|
import Button from './components/Button';
|
||||||
import ModalManager from './components/ModalManager';
|
import ModalManager from './components/ModalManager';
|
||||||
import AlertManager from './components/AlertManager';
|
import AlertManager from './components/AlertManager';
|
||||||
|
import RequestErrorModal from './components/RequestErrorModal';
|
||||||
import Translator from './Translator';
|
import Translator from './Translator';
|
||||||
import Store from './Store';
|
import Store from './Store';
|
||||||
import Session from './Session';
|
import Session from './Session';
|
||||||
@@ -141,7 +143,7 @@ export default class Application {
|
|||||||
bootExtensions(extensions) {
|
bootExtensions(extensions) {
|
||||||
Object.keys(extensions).forEach(name => {
|
Object.keys(extensions).forEach(name => {
|
||||||
const extension = extensions[name];
|
const extension = extensions[name];
|
||||||
|
|
||||||
const extenders = flattenDeep(extension.extend);
|
const extenders = flattenDeep(extension.extend);
|
||||||
|
|
||||||
for (const extender of extenders) {
|
for (const extender of extenders) {
|
||||||
@@ -328,9 +330,14 @@ export default class Application {
|
|||||||
children = app.translator.trans('core.lib.error.generic_message');
|
children = app.translator.trans('core.lib.error.generic_message');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isDebug = app.forum.attribute('debug');
|
||||||
|
|
||||||
error.alert = new Alert({
|
error.alert = new Alert({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
children
|
children,
|
||||||
|
controls: isDebug && [
|
||||||
|
<Button className="Button Button--link" onclick={this.showDebug.bind(this, error)}>Debug</Button>
|
||||||
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -345,6 +352,16 @@ export default class Application {
|
|||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {RequestError} error
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
showDebug(error) {
|
||||||
|
this.alerts.dismiss(this.requestError.alert);
|
||||||
|
|
||||||
|
this.modal.show(new RequestErrorModal({error}));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a URL to the route with the given name.
|
* Construct a URL to the route with the given name.
|
||||||
*
|
*
|
||||||
|
@@ -190,7 +190,7 @@ export default class Model {
|
|||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
delete(data, options = {}) {
|
delete(data, options = {}) {
|
||||||
if (!this.exists) return m.deferred.resolve().promise;
|
if (!this.exists) return m.deferred().resolve().promise;
|
||||||
|
|
||||||
return app.request(Object.assign({
|
return app.request(Object.assign({
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
|
@@ -37,6 +37,7 @@ import Placeholder from './components/Placeholder';
|
|||||||
import Separator from './components/Separator';
|
import Separator from './components/Separator';
|
||||||
import Dropdown from './components/Dropdown';
|
import Dropdown from './components/Dropdown';
|
||||||
import SplitDropdown from './components/SplitDropdown';
|
import SplitDropdown from './components/SplitDropdown';
|
||||||
|
import RequestErrorModal from './components/RequestErrorModal';
|
||||||
import FieldSet from './components/FieldSet';
|
import FieldSet from './components/FieldSet';
|
||||||
import Select from './components/Select';
|
import Select from './components/Select';
|
||||||
import Navigation from './components/Navigation';
|
import Navigation from './components/Navigation';
|
||||||
@@ -100,6 +101,7 @@ export default {
|
|||||||
'components/Separator': Separator,
|
'components/Separator': Separator,
|
||||||
'components/Dropdown': Dropdown,
|
'components/Dropdown': Dropdown,
|
||||||
'components/SplitDropdown': SplitDropdown,
|
'components/SplitDropdown': SplitDropdown,
|
||||||
|
'components/RequestErrorModal': RequestErrorModal,
|
||||||
'components/FieldSet': FieldSet,
|
'components/FieldSet': FieldSet,
|
||||||
'components/Select': Select,
|
'components/Select': Select,
|
||||||
'components/Navigation': Navigation,
|
'components/Navigation': Navigation,
|
||||||
|
@@ -29,6 +29,12 @@ export default class Button extends Component {
|
|||||||
attrs.className = attrs.className || '';
|
attrs.className = attrs.className || '';
|
||||||
attrs.type = attrs.type || 'button';
|
attrs.type = attrs.type || 'button';
|
||||||
|
|
||||||
|
// If a tooltip was provided for buttons without additional content, we also
|
||||||
|
// use this tooltip as text for screen readers
|
||||||
|
if (attrs.title && !this.props.children) {
|
||||||
|
attrs['aria-label'] = attrs.title;
|
||||||
|
}
|
||||||
|
|
||||||
// If nothing else is provided, we use the textual button content as tooltip
|
// If nothing else is provided, we use the textual button content as tooltip
|
||||||
if (!attrs.title && this.props.children) {
|
if (!attrs.title && this.props.children) {
|
||||||
attrs.title = extractText(this.props.children);
|
attrs.title = extractText(this.props.children);
|
||||||
|
30
js/src/common/components/RequestErrorModal.js
Normal file
30
js/src/common/components/RequestErrorModal.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import Modal from './Modal';
|
||||||
|
|
||||||
|
export default class RequestErrorModal extends Modal {
|
||||||
|
className() {
|
||||||
|
return 'RequestErrorModal Modal--large';
|
||||||
|
}
|
||||||
|
|
||||||
|
title() {
|
||||||
|
return this.props.error.xhr
|
||||||
|
? this.props.error.xhr.status+' '+this.props.error.xhr.statusText
|
||||||
|
: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
content() {
|
||||||
|
let responseText;
|
||||||
|
|
||||||
|
try {
|
||||||
|
responseText = JSON.stringify(JSON.parse(this.props.error.responseText), null, 2);
|
||||||
|
} catch (e) {
|
||||||
|
responseText = this.props.error.responseText;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div className="Modal-body">
|
||||||
|
<pre>
|
||||||
|
{this.props.error.options.method} {this.props.error.options.url}<br/><br/>
|
||||||
|
{responseText}
|
||||||
|
</pre>
|
||||||
|
</div>;
|
||||||
|
}
|
||||||
|
}
|
@@ -8,14 +8,15 @@ import icon from '../helpers/icon';
|
|||||||
* - `options` A map of option values to labels.
|
* - `options` A map of option values to labels.
|
||||||
* - `onchange` A callback to run when the selected value is changed.
|
* - `onchange` A callback to run when the selected value is changed.
|
||||||
* - `value` The value of the selected option.
|
* - `value` The value of the selected option.
|
||||||
|
* - `disabled` Disabled state for the input.
|
||||||
*/
|
*/
|
||||||
export default class Select extends Component {
|
export default class Select extends Component {
|
||||||
view() {
|
view() {
|
||||||
const {options, onchange, value} = this.props;
|
const {options, onchange, value, disabled} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<span className="Select">
|
<span className="Select">
|
||||||
<select className="Select-input FormControl" onchange={onchange ? m.withAttr('value', onchange.bind(this)) : undefined} value={value}>
|
<select className="Select-input FormControl" onchange={onchange ? m.withAttr('value', onchange.bind(this)) : undefined} value={value} disabled={disabled}>
|
||||||
{Object.keys(options).map(key => <option value={key}>{options[key]}</option>)}
|
{Object.keys(options).map(key => <option value={key}>{options[key]}</option>)}
|
||||||
</select>
|
</select>
|
||||||
{icon('fas fa-sort', {className: 'Select-caret'})}
|
{icon('fas fa-sort', {className: 'Select-caret'})}
|
||||||
|
@@ -91,6 +91,7 @@ Object.assign(User.prototype, {
|
|||||||
user.freshness = new Date();
|
user.freshness = new Date();
|
||||||
m.redraw();
|
m.redraw();
|
||||||
};
|
};
|
||||||
|
image.crossOrigin = 'anonymous';
|
||||||
image.src = this.avatarUrl();
|
image.src = this.avatarUrl();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
const scroll = window.requestAnimationFrame ||
|
const later = window.requestAnimationFrame ||
|
||||||
window.webkitRequestAnimationFrame ||
|
window.webkitRequestAnimationFrame ||
|
||||||
window.mozRequestAnimationFrame ||
|
window.mozRequestAnimationFrame ||
|
||||||
window.msRequestAnimationFrame ||
|
window.msRequestAnimationFrame ||
|
||||||
@@ -17,7 +17,7 @@ export default class ScrollListener {
|
|||||||
*/
|
*/
|
||||||
constructor(callback) {
|
constructor(callback) {
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.lastTop = -1;
|
this.ticking = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,27 +27,27 @@ export default class ScrollListener {
|
|||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
loop() {
|
loop() {
|
||||||
if (!this.active) return;
|
// THROTTLE: If the callback is still running (or hasn't yet run), we ignore
|
||||||
|
// further scroll events.
|
||||||
|
if (this.ticking) return;
|
||||||
|
|
||||||
this.update();
|
// Schedule the callback to be executed soon (TM), and stop throttling once
|
||||||
|
// the callback is done.
|
||||||
|
later(() => {
|
||||||
|
this.update();
|
||||||
|
this.ticking = false;
|
||||||
|
});
|
||||||
|
|
||||||
scroll(this.loop.bind(this));
|
this.ticking = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the scroll position has changed; if it has, run the handler.
|
* Run the callback, whether there was a scroll event or not.
|
||||||
*
|
*
|
||||||
* @param {Boolean} [force=false] Whether or not to force the handler to be
|
|
||||||
* run, even if the scroll position hasn't changed.
|
|
||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
update(force) {
|
update() {
|
||||||
const top = window.pageYOffset;
|
this.callback(window.pageYOffset);
|
||||||
|
|
||||||
if (this.lastTop !== top || force) {
|
|
||||||
this.callback(top);
|
|
||||||
this.lastTop = top;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,8 +57,10 @@ export default class ScrollListener {
|
|||||||
*/
|
*/
|
||||||
start() {
|
start() {
|
||||||
if (!this.active) {
|
if (!this.active) {
|
||||||
this.active = true;
|
window.addEventListener(
|
||||||
this.loop();
|
'scroll',
|
||||||
|
this.active = this.loop.bind(this)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,6 +70,8 @@ export default class ScrollListener {
|
|||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
stop() {
|
stop() {
|
||||||
this.active = false;
|
window.removeEventListener('scroll', this.active);
|
||||||
|
|
||||||
|
this.active = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,10 @@ export function truncate(string, length, start = 0) {
|
|||||||
* Create a slug out of the given string. Non-alphanumeric characters are
|
* Create a slug out of the given string. Non-alphanumeric characters are
|
||||||
* converted to hyphens.
|
* converted to hyphens.
|
||||||
*
|
*
|
||||||
|
* NOTE: This method does not use the comparably sophisticated transliteration
|
||||||
|
* mechanism that is employed in the backend. Therefore, it should only be used
|
||||||
|
* to *suggest* slugs that can be overridden by the user.
|
||||||
|
*
|
||||||
* @param {String} string
|
* @param {String} string
|
||||||
* @return {String}
|
* @return {String}
|
||||||
*/
|
*/
|
||||||
|
@@ -150,7 +150,7 @@ export default class AvatarEditor extends Component {
|
|||||||
const user = this.props.user;
|
const user = this.props.user;
|
||||||
const $input = $('<input type="file">');
|
const $input = $('<input type="file">');
|
||||||
|
|
||||||
$input.appendTo('body').hide().click().on('change', e => {
|
$input.appendTo('body').hide().click().on('input', e => {
|
||||||
this.upload($(e.target)[0].files[0]);
|
this.upload($(e.target)[0].files[0]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -77,7 +77,7 @@ export default class EditUserModal extends Modal {
|
|||||||
<label>{app.translator.trans('core.forum.edit_user.password_heading')}</label>
|
<label>{app.translator.trans('core.forum.edit_user.password_heading')}</label>
|
||||||
<div>
|
<div>
|
||||||
<label className="checkbox">
|
<label className="checkbox">
|
||||||
<input type="checkbox" checked={this.setPassword()} onChange={e => {
|
<input type="checkbox" onchange={e => {
|
||||||
this.setPassword(e.target.checked);
|
this.setPassword(e.target.checked);
|
||||||
m.redraw(true);
|
m.redraw(true);
|
||||||
if (e.target.checked) this.$('[name=password]').select();
|
if (e.target.checked) this.$('[name=password]').select();
|
||||||
|
@@ -13,7 +13,7 @@ export default class LogInButton extends Button {
|
|||||||
props.className = (props.className || '') + ' LogInButton';
|
props.className = (props.className || '') + ' LogInButton';
|
||||||
|
|
||||||
props.onclick = function() {
|
props.onclick = function() {
|
||||||
const width = 600;
|
const width = 580;
|
||||||
const height = 400;
|
const height = 400;
|
||||||
const $window = $(window);
|
const $window = $(window);
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ export default class LogInButton extends Button {
|
|||||||
`height=${height},` +
|
`height=${height},` +
|
||||||
`top=${$window.height() / 2 - height / 2},` +
|
`top=${$window.height() / 2 - height / 2},` +
|
||||||
`left=${$window.width() / 2 - width / 2},` +
|
`left=${$window.width() / 2 - width / 2},` +
|
||||||
'status=no,scrollbars=no,resizable=no');
|
'status=no,scrollbars=yes,resizable=no');
|
||||||
};
|
};
|
||||||
|
|
||||||
super.initProps(props);
|
super.initProps(props);
|
||||||
|
@@ -2,6 +2,7 @@ import Component from '../../common/Component';
|
|||||||
import avatar from '../../common/helpers/avatar';
|
import avatar from '../../common/helpers/avatar';
|
||||||
import icon from '../../common/helpers/icon';
|
import icon from '../../common/helpers/icon';
|
||||||
import humanTime from '../../common/helpers/humanTime';
|
import humanTime from '../../common/helpers/humanTime';
|
||||||
|
import Button from '../../common/components/Button';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The `Notification` component abstract displays a single notification.
|
* The `Notification` component abstract displays a single notification.
|
||||||
@@ -26,6 +27,17 @@ export default class Notification extends Component {
|
|||||||
|
|
||||||
if (!isInitialized) $(element).click(this.markAsRead.bind(this));
|
if (!isInitialized) $(element).click(this.markAsRead.bind(this));
|
||||||
}}>
|
}}>
|
||||||
|
{!notification.isRead() && Button.component({
|
||||||
|
className: 'Notification-action Button Button--icon Button--link',
|
||||||
|
icon: 'fas fa-check',
|
||||||
|
title: app.translator.trans('core.forum.notifications.mark_as_read_tooltip'),
|
||||||
|
onclick: e => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
this.markAsRead();
|
||||||
|
}
|
||||||
|
})}
|
||||||
{avatar(notification.fromUser())}
|
{avatar(notification.fromUser())}
|
||||||
{icon(this.icon(), {className: 'Notification-icon'})}
|
{icon(this.icon(), {className: 'Notification-icon'})}
|
||||||
<span className="Notification-content">{this.content()}</span>
|
<span className="Notification-content">{this.content()}</span>
|
||||||
|
@@ -39,7 +39,7 @@ export default class Post extends Component {
|
|||||||
view() {
|
view() {
|
||||||
const attrs = this.attrs();
|
const attrs = this.attrs();
|
||||||
|
|
||||||
attrs.className = 'Post ' + (this.loading ? 'Post--loading ' : '') + (attrs.className || '');
|
attrs.className = this.classes(attrs.className).join(' ');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<article {...attrs}>
|
<article {...attrs}>
|
||||||
@@ -98,6 +98,26 @@ export default class Post extends Component {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the post's classes.
|
||||||
|
*
|
||||||
|
* @param string classes
|
||||||
|
* @returns {string[]}
|
||||||
|
*/
|
||||||
|
classes(existing) {
|
||||||
|
let classes = (existing || '').split(' ').concat(['Post']);
|
||||||
|
|
||||||
|
if (this.loading) {
|
||||||
|
classes.push('Post--loading');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.props.post.user() === app.session.user) {
|
||||||
|
classes.push('Post--by-actor');
|
||||||
|
}
|
||||||
|
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build an item list for the post's actions.
|
* Build an item list for the post's actions.
|
||||||
*
|
*
|
||||||
|
@@ -2,7 +2,6 @@ import Component from '../../common/Component';
|
|||||||
import ScrollListener from '../../common/utils/ScrollListener';
|
import ScrollListener from '../../common/utils/ScrollListener';
|
||||||
import PostLoading from './LoadingPost';
|
import PostLoading from './LoadingPost';
|
||||||
import anchorScroll from '../../common/utils/anchorScroll';
|
import anchorScroll from '../../common/utils/anchorScroll';
|
||||||
import mixin from '../../common/utils/mixin';
|
|
||||||
import evented from '../../common/utils/evented';
|
import evented from '../../common/utils/evented';
|
||||||
import ReplyPlaceholder from './ReplyPlaceholder';
|
import ReplyPlaceholder from './ReplyPlaceholder';
|
||||||
import Button from '../../common/components/Button';
|
import Button from '../../common/components/Button';
|
||||||
@@ -586,7 +585,7 @@ class PostStream extends Component {
|
|||||||
*/
|
*/
|
||||||
unpause() {
|
unpause() {
|
||||||
this.paused = false;
|
this.paused = false;
|
||||||
this.scrollListener.update(true);
|
this.scrollListener.update();
|
||||||
this.trigger('unpaused');
|
this.trigger('unpaused');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,6 @@ import Component from '../../common/Component';
|
|||||||
import icon from '../../common/helpers/icon';
|
import icon from '../../common/helpers/icon';
|
||||||
import ScrollListener from '../../common/utils/ScrollListener';
|
import ScrollListener from '../../common/utils/ScrollListener';
|
||||||
import SubtreeRetainer from '../../common/utils/SubtreeRetainer';
|
import SubtreeRetainer from '../../common/utils/SubtreeRetainer';
|
||||||
import computed from '../../common/utils/computed';
|
|
||||||
import formatNumber from '../../common/utils/formatNumber';
|
import formatNumber from '../../common/utils/formatNumber';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -365,7 +364,7 @@ export default class PostStreamScrubber extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onresize() {
|
onresize() {
|
||||||
this.scrollListener.update(true);
|
this.scrollListener.update();
|
||||||
|
|
||||||
// Adjust the height of the scrollbar so that it fills the height of
|
// Adjust the height of the scrollbar so that it fills the height of
|
||||||
// the sidebar and doesn't overlap the footer.
|
// the sidebar and doesn't overlap the footer.
|
||||||
|
@@ -102,7 +102,7 @@ export default class ReplyComposer extends ComposerBody {
|
|||||||
app.alerts.show(
|
app.alerts.show(
|
||||||
alert = new Alert({
|
alert = new Alert({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
message: app.translator.trans('core.forum.composer_reply.posted_message'),
|
children: app.translator.trans('core.forum.composer_reply.posted_message'),
|
||||||
controls: [viewButton]
|
controls: [viewButton]
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
@@ -52,6 +52,10 @@ export default class ReplyPlaceholder extends Component {
|
|||||||
// body with a preview.
|
// body with a preview.
|
||||||
let preview;
|
let preview;
|
||||||
const updateInterval = setInterval(() => {
|
const updateInterval = setInterval(() => {
|
||||||
|
// Since we're polling, the composer may have been closed in the meantime,
|
||||||
|
// so we bail in that case.
|
||||||
|
if (!app.composer.component) return;
|
||||||
|
|
||||||
const content = app.composer.component.content();
|
const content = app.composer.component.content();
|
||||||
|
|
||||||
if (preview === content) return;
|
if (preview === content) return;
|
||||||
|
@@ -122,6 +122,8 @@ export default class TextEditor extends Component {
|
|||||||
setSelectionRange(start, end) {
|
setSelectionRange(start, end) {
|
||||||
const $textarea = this.$('textarea');
|
const $textarea = this.$('textarea');
|
||||||
|
|
||||||
|
if (!$textarea.length) return;
|
||||||
|
|
||||||
$textarea[0].setSelectionRange(start, end);
|
$textarea[0].setSelectionRange(start, end);
|
||||||
$textarea.focus();
|
$textarea.focus();
|
||||||
}
|
}
|
||||||
@@ -134,6 +136,8 @@ export default class TextEditor extends Component {
|
|||||||
getSelectionRange() {
|
getSelectionRange() {
|
||||||
const $textarea = this.$('textarea');
|
const $textarea = this.$('textarea');
|
||||||
|
|
||||||
|
if (!$textarea.length) return [0, 0];
|
||||||
|
|
||||||
return [$textarea[0].selectionStart, $textarea[0].selectionEnd];
|
return [$textarea[0].selectionStart, $textarea[0].selectionEnd];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -88,8 +88,13 @@ export default class UserPage extends Page {
|
|||||||
loadUser(username) {
|
loadUser(username) {
|
||||||
const lowercaseUsername = username.toLowerCase();
|
const lowercaseUsername = username.toLowerCase();
|
||||||
|
|
||||||
|
// Load the preloaded user object, if any, into the global app store
|
||||||
|
// We don't use the output of the method because it returns raw JSON
|
||||||
|
// instead of the parsed models
|
||||||
|
app.preloadedApiDocument();
|
||||||
|
|
||||||
app.store.all('users').some(user => {
|
app.store.all('users').some(user => {
|
||||||
if (user.username().toLowerCase() === lowercaseUsername && user.joinTime()) {
|
if ((user.username().toLowerCase() === lowercaseUsername || user.id() === username) && user.joinTime()) {
|
||||||
this.show(user);
|
this.show(user);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -86,6 +86,10 @@ export default class History {
|
|||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
back() {
|
back() {
|
||||||
|
if (! this.canGoBack()) {
|
||||||
|
return this.home();
|
||||||
|
}
|
||||||
|
|
||||||
this.stack.pop();
|
this.stack.pop();
|
||||||
|
|
||||||
m.route(this.getCurrent().url);
|
m.route(this.getCurrent().url);
|
||||||
|
@@ -7,10 +7,24 @@
|
|||||||
*/
|
*/
|
||||||
export default class KeyboardNavigatable {
|
export default class KeyboardNavigatable {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
/**
|
||||||
|
* Callback to be executed for a specified input.
|
||||||
|
*
|
||||||
|
* @callback KeyboardNavigatable~keyCallback
|
||||||
|
* @param {KeyboardEvent} event
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
this.callbacks = {};
|
this.callbacks = {};
|
||||||
|
|
||||||
// By default, always handle keyboard navigation.
|
/**
|
||||||
this.whenCallback = () => true;
|
* Callback that determines whether keyboard input should be handled.
|
||||||
|
* By default, always handle keyboard navigation.
|
||||||
|
*
|
||||||
|
* @callback whenCallback
|
||||||
|
* @param {KeyboardEvent} event
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
this.whenCallback = event => true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,7 +33,7 @@ export default class KeyboardNavigatable {
|
|||||||
* This will be triggered by the Up key.
|
* This will be triggered by the Up key.
|
||||||
*
|
*
|
||||||
* @public
|
* @public
|
||||||
* @param {Function} callback
|
* @param {KeyboardNavigatable~keyCallback} callback
|
||||||
* @return {KeyboardNavigatable}
|
* @return {KeyboardNavigatable}
|
||||||
*/
|
*/
|
||||||
onUp(callback) {
|
onUp(callback) {
|
||||||
@@ -37,7 +51,7 @@ export default class KeyboardNavigatable {
|
|||||||
* This will be triggered by the Down key.
|
* This will be triggered by the Down key.
|
||||||
*
|
*
|
||||||
* @public
|
* @public
|
||||||
* @param {Function} callback
|
* @param {KeyboardNavigatable~keyCallback} callback
|
||||||
* @return {KeyboardNavigatable}
|
* @return {KeyboardNavigatable}
|
||||||
*/
|
*/
|
||||||
onDown(callback) {
|
onDown(callback) {
|
||||||
@@ -55,7 +69,7 @@ export default class KeyboardNavigatable {
|
|||||||
* This will be triggered by the Return and Tab keys..
|
* This will be triggered by the Return and Tab keys..
|
||||||
*
|
*
|
||||||
* @public
|
* @public
|
||||||
* @param {Function} callback
|
* @param {KeyboardNavigatable~keyCallback} callback
|
||||||
* @return {KeyboardNavigatable}
|
* @return {KeyboardNavigatable}
|
||||||
*/
|
*/
|
||||||
onSelect(callback) {
|
onSelect(callback) {
|
||||||
@@ -73,7 +87,7 @@ export default class KeyboardNavigatable {
|
|||||||
* This will be triggered by the Escape key.
|
* This will be triggered by the Escape key.
|
||||||
*
|
*
|
||||||
* @public
|
* @public
|
||||||
* @param {Function} callback
|
* @param {KeyboardNavigatable~keyCallback} callback
|
||||||
* @return {KeyboardNavigatable}
|
* @return {KeyboardNavigatable}
|
||||||
*/
|
*/
|
||||||
onCancel(callback) {
|
onCancel(callback) {
|
||||||
@@ -81,7 +95,7 @@ export default class KeyboardNavigatable {
|
|||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
callback(e);
|
callback(e);
|
||||||
}
|
};
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -92,7 +106,7 @@ export default class KeyboardNavigatable {
|
|||||||
* This will be triggered by the Backspace key.
|
* This will be triggered by the Backspace key.
|
||||||
*
|
*
|
||||||
* @public
|
* @public
|
||||||
* @param {Function} callback
|
* @param {KeyboardNavigatable~keyCallback} callback
|
||||||
* @return {KeyboardNavigatable}
|
* @return {KeyboardNavigatable}
|
||||||
*/
|
*/
|
||||||
onRemove(callback) {
|
onRemove(callback) {
|
||||||
@@ -110,7 +124,7 @@ export default class KeyboardNavigatable {
|
|||||||
* Provide a callback that determines whether keyboard input should be handled.
|
* Provide a callback that determines whether keyboard input should be handled.
|
||||||
*
|
*
|
||||||
* @public
|
* @public
|
||||||
* @param {Function} callback
|
* @param {KeyboardNavigatable~whenCallback} callback
|
||||||
* @return {KeyboardNavigatable}
|
* @return {KeyboardNavigatable}
|
||||||
*/
|
*/
|
||||||
when(callback) {
|
when(callback) {
|
||||||
@@ -138,7 +152,7 @@ export default class KeyboardNavigatable {
|
|||||||
*/
|
*/
|
||||||
navigate(event) {
|
navigate(event) {
|
||||||
// This callback determines whether keyboard should be handled or ignored.
|
// This callback determines whether keyboard should be handled or ignored.
|
||||||
if (!this.whenCallback()) return;
|
if (!this.whenCallback(event)) return;
|
||||||
|
|
||||||
const keyCallback = this.callbacks[event.which];
|
const keyCallback = this.callbacks[event.which];
|
||||||
if (keyCallback) {
|
if (keyCallback) {
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import Alert from '../../common/components/Alert';
|
||||||
import Button from '../../common/components/Button';
|
import Button from '../../common/components/Button';
|
||||||
import Separator from '../../common/components/Separator';
|
import Separator from '../../common/components/Separator';
|
||||||
import EditUserModal from '../components/EditUserModal';
|
import EditUserModal from '../components/EditUserModal';
|
||||||
@@ -61,7 +62,7 @@ export default {
|
|||||||
items.add('edit', Button.component({
|
items.add('edit', Button.component({
|
||||||
icon: 'fas fa-pencil-alt',
|
icon: 'fas fa-pencil-alt',
|
||||||
children: app.translator.trans('core.forum.user_controls.edit_button'),
|
children: app.translator.trans('core.forum.user_controls.edit_button'),
|
||||||
onclick: this.editAction.bind(user)
|
onclick: this.editAction.bind(this, user)
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +85,7 @@ export default {
|
|||||||
items.add('delete', Button.component({
|
items.add('delete', Button.component({
|
||||||
icon: 'fas fa-times',
|
icon: 'fas fa-times',
|
||||||
children: app.translator.trans('core.forum.user_controls.delete_button'),
|
children: app.translator.trans('core.forum.user_controls.delete_button'),
|
||||||
onclick: this.deleteAction.bind(user)
|
onclick: this.deleteAction.bind(this, user)
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,23 +94,51 @@ export default {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete the user.
|
* Delete the user.
|
||||||
|
*
|
||||||
|
* @param {User} user
|
||||||
*/
|
*/
|
||||||
deleteAction() {
|
deleteAction(user) {
|
||||||
if (confirm(app.translator.trans('core.forum.user_controls.delete_confirmation'))) {
|
if (!confirm(app.translator.trans('core.forum.user_controls.delete_confirmation'))) {
|
||||||
this.delete().then(() => {
|
return;
|
||||||
if (app.current instanceof UserPage && app.current.user === this) {
|
|
||||||
app.history.back();
|
|
||||||
} else {
|
|
||||||
window.location.reload();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
user.delete().then(() => {
|
||||||
|
this.showDeletionAlert(user, 'success');
|
||||||
|
if (app.current instanceof UserPage && app.current.user === user) {
|
||||||
|
app.history.back();
|
||||||
|
} else {
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
}).catch(() => this.showDeletionAlert(user, 'error'));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show deletion alert of user.
|
||||||
|
*
|
||||||
|
* @param {User} user
|
||||||
|
* @param {string} type
|
||||||
|
*/
|
||||||
|
showDeletionAlert(user, type) {
|
||||||
|
const { username, email } = user.data.attributes;
|
||||||
|
const message = {
|
||||||
|
success: 'core.forum.user_controls.delete_success_message',
|
||||||
|
error: 'core.forum.user_controls.delete_error_message',
|
||||||
|
}[type];
|
||||||
|
|
||||||
|
app.alerts.show(new Alert({
|
||||||
|
type,
|
||||||
|
children: app.translator.trans(
|
||||||
|
message, { username, email }
|
||||||
|
)
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Edit the user.
|
* Edit the user.
|
||||||
|
*
|
||||||
|
* @param {User} user
|
||||||
*/
|
*/
|
||||||
editAction() {
|
editAction(user) {
|
||||||
app.modal.show(new EditUserModal({user: this}));
|
app.modal.show(new EditUserModal({ user }));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -8,28 +8,25 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldset {
|
fieldset, .Alert {
|
||||||
margin-bottom: 30px;
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
> ul {
|
fieldset > ul {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.MailPage-MailSettings-input {
|
.MailPage-MailSettings-input {
|
||||||
|
|
||||||
label {
|
label {
|
||||||
margin-bottom: 5px;
|
display: block;
|
||||||
}
|
|
||||||
|
|
||||||
.FormControl {
|
|
||||||
margin-bottom: 7px;
|
margin-bottom: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:last-child {
|
.Select {
|
||||||
margin-bottom: 0;
|
display: block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -156,6 +156,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.Modal {
|
.Modal {
|
||||||
|
max-width: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
-webkit-transform: none !important;
|
-webkit-transform: none !important;
|
||||||
transform: none !important;
|
transform: none !important;
|
||||||
|
5
less/common/ValidationError.less
Normal file
5
less/common/ValidationError.less
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
.ValidationError {
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: @validation-error-color;
|
||||||
|
}
|
@@ -1,7 +1,7 @@
|
|||||||
@import "fontawesome";
|
@import "fontawesome";
|
||||||
@import "fa-brands";
|
@import "brands";
|
||||||
@import "fa-regular";
|
@import "regular";
|
||||||
@import "fa-solid";
|
@import "solid";
|
||||||
@fa-font-path: "./fonts";
|
@fa-font-path: "./fonts";
|
||||||
|
|
||||||
@import "normalize";
|
@import "normalize";
|
||||||
@@ -26,3 +26,4 @@
|
|||||||
@import "Search";
|
@import "Search";
|
||||||
@import "Select";
|
@import "Select";
|
||||||
@import "Tooltip";
|
@import "Tooltip";
|
||||||
|
@import "ValidationError";
|
||||||
|
@@ -68,15 +68,19 @@
|
|||||||
@hero-color: @control-color;
|
@hero-color: @control-color;
|
||||||
@hero-muted-color: @control-color;
|
@hero-muted-color: @control-color;
|
||||||
|
|
||||||
|
@error-color: #d83e3e;
|
||||||
|
|
||||||
@alert-bg: #fff2ae;
|
@alert-bg: #fff2ae;
|
||||||
@alert-color: #ad6c00;
|
@alert-color: #ad6c00;
|
||||||
|
|
||||||
@alert-error-bg: #d83e3e;
|
@alert-error-bg: @error-color;
|
||||||
@alert-error-color: #fff;
|
@alert-error-color: #fff;
|
||||||
|
|
||||||
@alert-success-bg: #B4F1AF;
|
@alert-success-bg: #B4F1AF;
|
||||||
@alert-success-color: #33722D;
|
@alert-success-color: #33722D;
|
||||||
|
|
||||||
|
@validation-error-color: @error-color;
|
||||||
|
|
||||||
.define-header(@config-colored-header);
|
.define-header(@config-colored-header);
|
||||||
.define-header(false) {
|
.define-header(false) {
|
||||||
@header-bg: @body-bg;
|
@header-bg: @body-bg;
|
||||||
|
@@ -87,6 +87,10 @@
|
|||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background: @control-bg;
|
background: @control-bg;
|
||||||
|
|
||||||
|
.Notification-action {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.Avatar {
|
.Avatar {
|
||||||
.Avatar--size(24px);
|
.Avatar--size(24px);
|
||||||
@@ -98,6 +102,27 @@
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.Notification-action {
|
||||||
|
float: right;
|
||||||
|
display: none;
|
||||||
|
margin-top: -7px;
|
||||||
|
margin-right: -10px;
|
||||||
|
line-height: inherit;
|
||||||
|
padding: 5px 0;
|
||||||
|
|
||||||
|
& when (@config-colored-header = true) {
|
||||||
|
.Button--color(@control-color, @control-bg);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: @link-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.Notification-icon {
|
.Notification-icon {
|
||||||
float: left;
|
float: left;
|
||||||
|
@@ -78,6 +78,7 @@
|
|||||||
|
|
||||||
&, > li {
|
&, > li {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
margin-right: 5px
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.UserCard-info {
|
.UserCard-info {
|
||||||
|
@@ -1,10 +1,5 @@
|
|||||||
.UserPage {
|
.UserPage {
|
||||||
.UserCard-controls {
|
.UserHero .Dropdown-toggle .Button-icon {
|
||||||
float: right;
|
display: none;
|
||||||
|
|
||||||
.Dropdown-toggle .Button-icon {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
@@ -3,15 +3,13 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Util\Str;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'up' => function (Builder $schema) {
|
'up' => function (Builder $schema) {
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
@@ -3,13 +3,10 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
|
||||||
@@ -24,18 +21,14 @@ return [
|
|||||||
})
|
})
|
||||||
->delete();
|
->delete();
|
||||||
|
|
||||||
$schema->table('access_tokens', function (Blueprint $table) use ($schema) {
|
$schema->table('access_tokens', function (Blueprint $table) {
|
||||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('access_tokens', function (Blueprint $table) use ($schema) {
|
$schema->table('access_tokens', function (Blueprint $table) {
|
||||||
$table->dropForeign(['user_id']);
|
$table->dropForeign(['user_id']);
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -3,27 +3,22 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'up' => function (Builder $schema) {
|
'up' => function (Builder $schema) {
|
||||||
$schema->table('api_keys', function (Blueprint $table) use ($schema) {
|
$schema->table('api_keys', function (Blueprint $table) {
|
||||||
$table->dropPrimary(['id']);
|
$table->dropPrimary(['id']);
|
||||||
$table->renameColumn('id', 'key');
|
$table->renameColumn('id', 'key');
|
||||||
$table->unique('key');
|
$table->unique('key');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$schema->table('api_keys', function (Blueprint $table) use ($schema) {
|
$schema->table('api_keys', function (Blueprint $table) {
|
||||||
$table->increments('id');
|
$table->increments('id');
|
||||||
$table->string('allowed_ips')->nullable();
|
$table->string('allowed_ips')->nullable();
|
||||||
$table->string('scopes')->nullable();
|
$table->string('scopes')->nullable();
|
||||||
@@ -32,25 +27,19 @@ return [
|
|||||||
$table->dateTime('last_activity_at')->nullable();
|
$table->dateTime('last_activity_at')->nullable();
|
||||||
|
|
||||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('api_keys', function (Blueprint $table) use ($schema) {
|
$schema->table('api_keys', function (Blueprint $table) {
|
||||||
$table->dropForeign(['user_id']);
|
$table->dropForeign(['user_id']);
|
||||||
$table->dropColumn('id', 'allowed_ips', 'user_id', 'scopes', 'created_at');
|
$table->dropColumn('id', 'allowed_ips', 'user_id', 'scopes', 'created_at');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$schema->table('api_keys', function (Blueprint $table) use ($schema) {
|
$schema->table('api_keys', function (Blueprint $table) {
|
||||||
$table->dropUnique(['key']);
|
$table->dropUnique(['key']);
|
||||||
$table->renameColumn('key', 'id');
|
$table->renameColumn('key', 'id');
|
||||||
$table->primary('id');
|
$table->primary('id');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,13 +3,10 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Query\Expression;
|
use Illuminate\Database\Query\Expression;
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
@@ -34,26 +31,22 @@ return [
|
|||||||
'last_post_id' => $selectId('posts', 'last_post_id'),
|
'last_post_id' => $selectId('posts', 'last_post_id'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema->table('discussions', function (Blueprint $table) use ($schema) {
|
$schema->table('discussions', function (Blueprint $table) {
|
||||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
|
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
|
||||||
$table->foreign('last_posted_user_id')->references('id')->on('users')->onDelete('set null');
|
$table->foreign('last_posted_user_id')->references('id')->on('users')->onDelete('set null');
|
||||||
$table->foreign('hidden_user_id')->references('id')->on('users')->onDelete('set null');
|
$table->foreign('hidden_user_id')->references('id')->on('users')->onDelete('set null');
|
||||||
$table->foreign('first_post_id')->references('id')->on('posts')->onDelete('set null');
|
$table->foreign('first_post_id')->references('id')->on('posts')->onDelete('set null');
|
||||||
$table->foreign('last_post_id')->references('id')->on('posts')->onDelete('set null');
|
$table->foreign('last_post_id')->references('id')->on('posts')->onDelete('set null');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('discussions', function (Blueprint $table) use ($schema) {
|
$schema->table('discussions', function (Blueprint $table) {
|
||||||
$table->dropForeign(['user_id']);
|
$table->dropForeign(['user_id']);
|
||||||
$table->dropForeign(['last_posted_user_id']);
|
$table->dropForeign(['last_posted_user_id']);
|
||||||
$table->dropForeign(['hidden_user_id']);
|
$table->dropForeign(['hidden_user_id']);
|
||||||
$table->dropForeign(['first_post_id']);
|
$table->dropForeign(['first_post_id']);
|
||||||
$table->dropForeign(['last_post_id']);
|
$table->dropForeign(['last_post_id']);
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,13 +3,10 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
|
||||||
@@ -27,20 +24,16 @@ return [
|
|||||||
})
|
})
|
||||||
->delete();
|
->delete();
|
||||||
|
|
||||||
$schema->table('discussion_user', function (Blueprint $table) use ($schema) {
|
$schema->table('discussion_user', function (Blueprint $table) {
|
||||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
||||||
$table->foreign('discussion_id')->references('id')->on('discussions')->onDelete('cascade');
|
$table->foreign('discussion_id')->references('id')->on('discussions')->onDelete('cascade');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('discussion_user', function (Blueprint $table) use ($schema) {
|
$schema->table('discussion_user', function (Blueprint $table) {
|
||||||
$table->dropForeign(['user_id']);
|
$table->dropForeign(['user_id']);
|
||||||
$table->dropForeign(['discussion_id']);
|
$table->dropForeign(['discussion_id']);
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,13 +3,10 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
|
||||||
@@ -24,18 +21,14 @@ return [
|
|||||||
})
|
})
|
||||||
->delete();
|
->delete();
|
||||||
|
|
||||||
$schema->table('email_tokens', function (Blueprint $table) use ($schema) {
|
$schema->table('email_tokens', function (Blueprint $table) {
|
||||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('email_tokens', function (Blueprint $table) use ($schema) {
|
$schema->table('email_tokens', function (Blueprint $table) {
|
||||||
$table->dropForeign(['user_id']);
|
$table->dropForeign(['user_id']);
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,13 +3,10 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
|
||||||
@@ -24,18 +21,14 @@ return [
|
|||||||
})
|
})
|
||||||
->delete();
|
->delete();
|
||||||
|
|
||||||
$schema->table('group_permission', function (Blueprint $table) use ($schema) {
|
$schema->table('group_permission', function (Blueprint $table) {
|
||||||
$table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade');
|
$table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('group_permission', function (Blueprint $table) use ($schema) {
|
$schema->table('group_permission', function (Blueprint $table) {
|
||||||
$table->dropForeign(['group_id']);
|
$table->dropForeign(['group_id']);
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
use Flarum\Database\Migration;
|
||||||
|
@@ -3,13 +3,10 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
|
||||||
@@ -27,20 +24,16 @@ return [
|
|||||||
})
|
})
|
||||||
->delete();
|
->delete();
|
||||||
|
|
||||||
$schema->table('group_user', function (Blueprint $table) use ($schema) {
|
$schema->table('group_user', function (Blueprint $table) {
|
||||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
||||||
$table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade');
|
$table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('group_user', function (Blueprint $table) use ($schema) {
|
$schema->table('group_user', function (Blueprint $table) {
|
||||||
$table->dropForeign(['user_id']);
|
$table->dropForeign(['user_id']);
|
||||||
$table->dropForeign(['group_id']);
|
$table->dropForeign(['group_id']);
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -3,10 +3,8 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
@@ -3,13 +3,10 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Flarum.
|
* This file is part of Flarum.
|
||||||
*
|
*
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
* For detailed copyright and license information, please view the
|
||||||
*
|
* LICENSE file that was distributed with this source code.
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Database\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Schema\Builder;
|
use Illuminate\Database\Schema\Builder;
|
||||||
|
|
||||||
@@ -31,20 +28,16 @@ return [
|
|||||||
})
|
})
|
||||||
->update(['from_user_id' => null]);
|
->update(['from_user_id' => null]);
|
||||||
|
|
||||||
$schema->table('notifications', function (Blueprint $table) use ($schema) {
|
$schema->table('notifications', function (Blueprint $table) {
|
||||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
|
||||||
$table->foreign('from_user_id')->references('id')->on('users')->onDelete('set null');
|
$table->foreign('from_user_id')->references('id')->on('users')->onDelete('set null');
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'down' => function (Builder $schema) {
|
'down' => function (Builder $schema) {
|
||||||
$schema->table('notifications', function (Blueprint $table) use ($schema) {
|
$schema->table('notifications', function (Blueprint $table) {
|
||||||
$table->dropForeign(['user_id']);
|
$table->dropForeign(['user_id']);
|
||||||
$table->dropForeign(['from_user_id']);
|
$table->dropForeign(['from_user_id']);
|
||||||
|
|
||||||
Migration::fixIndexNames($schema, $table);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user