+ diff --git a/.gitignore b/.gitignore
index fc9ad70a7..fac06f2b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,22 @@
/vendor
+composer.lock
/node_modules
/public/storage
Homestead.yaml
Homestead.json
docker/data
.env
+.user.ini
+/index.html
+/404.html
+/.htaccess
+storage/test
+old_vendor
+new_vendor
+app/test/*
+config/*_local.php
+storage/app
+storage/_old_app
+storage/app/.gitignore
+storage/app/public/.gitignore
+composer.lock
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/app/Acl/Acl.php b/app/Acl/Acl.php
old mode 100644
new mode 100755
diff --git a/app/Acl/Eloquent/Group.php b/app/Acl/Eloquent/Group.php
old mode 100644
new mode 100755
index b90f70869..925e6b41b
--- a/app/Acl/Eloquent/Group.php
+++ b/app/Acl/Eloquent/Group.php
@@ -11,6 +11,8 @@ class Group extends Model
protected $fillable = array(
'name',
'users',
+ 'principal',
+ 'public_scope',
'description',
'directory',
'ldap_dn',
diff --git a/app/Acl/Eloquent/Role.php b/app/Acl/Eloquent/Role.php
old mode 100644
new mode 100755
diff --git a/app/Acl/Eloquent/RolePermissions.php b/app/Acl/Eloquent/RolePermissions.php
old mode 100644
new mode 100755
diff --git a/app/Acl/Eloquent/Roleactor.php b/app/Acl/Eloquent/Roleactor.php
old mode 100644
new mode 100755
diff --git a/app/Acl/Permissions.php b/app/Acl/Permissions.php
old mode 100644
new mode 100755
index 8bb916277..13b601dfc
--- a/app/Acl/Permissions.php
+++ b/app/Acl/Permissions.php
@@ -14,6 +14,7 @@ class Permissions {
const EDIT_ISSUE = 'edit_issue';
const EDIT_SELF_ISSUE = 'edit_self_issue';
const DELETE_ISSUE = 'delete_issue';
+ const DELETE_SELF_ISSUE = 'delete_self_issue';
const LINK_ISSUE = 'link_issue';
const MOVE_ISSUE = 'move_issue';
const RESOLVE_ISSUE = 'resolve_issue';
@@ -58,6 +59,7 @@ public static function all()
static::EDIT_ISSUE,
static::EDIT_SELF_ISSUE,
static::DELETE_ISSUE,
+ static::DELETE_SELF_ISSUE,
static::LINK_ISSUE,
static::MOVE_ISSUE,
static::RESOLVE_ISSUE,
@@ -86,4 +88,4 @@ public static function all()
];
}
-}
+}
\ No newline at end of file
diff --git a/app/ActiveDirectory/Eloquent/Directory.php b/app/ActiveDirectory/Eloquent/Directory.php
old mode 100644
new mode 100755
diff --git a/app/ActiveDirectory/LDAP.php b/app/ActiveDirectory/LDAP.php
old mode 100644
new mode 100755
diff --git a/app/Console/Commands/Inspire.php b/app/Console/Commands/Inspire.php
old mode 100644
new mode 100755
diff --git a/app/Console/Commands/RemoveLogs.php b/app/Console/Commands/RemoveLogs.php
old mode 100644
new mode 100755
index f7215d48d..bbe7f51a0
--- a/app/Console/Commands/RemoveLogs.php
+++ b/app/Console/Commands/RemoveLogs.php
@@ -39,6 +39,7 @@ public function __construct()
public function handle()
{
$durations = [
+ '0d' => 'now',
'3m' => '3 months',
'6m' => '6 months',
'1y' => '1 year',
@@ -56,7 +57,14 @@ public function handle()
}
}
- $removed_at = strtotime('-' . $log_save_duration);
+ if ($log_save_duration == 'now')
+ {
+ $removed_at = strtotime($log_save_duration) * 1000;
+ }
+ else
+ {
+ $removed_at = strtotime('-' . $log_save_duration) * 1000;
+ }
ApiAccessLogs::where('requested_start_at', '<', $removed_at)->delete();
}
diff --git a/app/Console/Commands/SendEmails.php b/app/Console/Commands/SendEmails.php
old mode 100644
new mode 100755
index 865ec26f4..58303b96a
--- a/app/Console/Commands/SendEmails.php
+++ b/app/Console/Commands/SendEmails.php
@@ -363,10 +363,15 @@ public function otherNoticeHandle($project, $activity)
$uids = Acl::getUserIdsByPermission('view_project', $project->key);
- $to_users = EloquentUser::find(array_unique($uids));
+ $to_users = EloquentUser::find(array_values(array_unique($uids)));
foreach ($to_users as $to_user)
{
+ if ($to_user->invalid_flag == 1)
+ {
+ continue;
+ }
+
$from = $activity['user']['name'];
$to = $to_user['email'];
try {
@@ -520,6 +525,11 @@ public function issueNoticeHandle($project, $activity)
$to_users = EloquentUser::find(array_values(array_unique(array_filter($uids))));
foreach ($to_users as $to_user)
{
+ if ($to_user->invalid_flag == 1)
+ {
+ continue;
+ }
+
$new_data = $data;
if (in_array($to_user->id, $atWho))
{
diff --git a/app/Console/Commands/SnapSprint.php b/app/Console/Commands/SnapSprint.php
old mode 100644
new mode 100755
diff --git a/app/Console/Commands/SyncLdap.php b/app/Console/Commands/SyncLdap.php
old mode 100644
new mode 100755
diff --git a/app/Console/Commands/TriggerWebhooks.php b/app/Console/Commands/TriggerWebhooks.php
old mode 100644
new mode 100755
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
old mode 100644
new mode 100755
index 9ee36ebcb..245d10c10
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -17,6 +17,7 @@ class Kernel extends ConsoleKernel
'App\Console\Commands\SyncLdap',
'App\Console\Commands\SnapSprint',
'App\Console\Commands\RemoveLogs',
+ 'App\Console\Commands\ImportFile',
// Commands\Inspire::class,
];
@@ -31,7 +32,7 @@ protected function schedule(Schedule $schedule)
$schedule->command('email:send')
->everyMinute();
$schedule->command('sprint:snap')
- ->hourly();
+ ->dailyAt('23:20');
$schedule->command('ldap:sync')
->daily();
$schedule->command('logs:remove')
diff --git a/app/Customization/Eloquent/EventNotifications.php b/app/Customization/Eloquent/EventNotifications.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/Events.php b/app/Customization/Eloquent/Events.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/Field.php b/app/Customization/Eloquent/Field.php
old mode 100644
new mode 100755
index 47561dfa9..8af6d5f50
--- a/app/Customization/Eloquent/Field.php
+++ b/app/Customization/Eloquent/Field.php
@@ -17,6 +17,9 @@ class Field extends Model
'description',
'defaultValue',
'optionValues',
+ 'minValue',
+ 'maxValue',
+ 'maxLength',
'project_key'
);
}
diff --git a/app/Customization/Eloquent/Priority.php b/app/Customization/Eloquent/Priority.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/PriorityProperty.php b/app/Customization/Eloquent/PriorityProperty.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/Resolution.php b/app/Customization/Eloquent/Resolution.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/ResolutionProperty.php b/app/Customization/Eloquent/ResolutionProperty.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/Screen.php b/app/Customization/Eloquent/Screen.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/State.php b/app/Customization/Eloquent/State.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/StateProperty.php b/app/Customization/Eloquent/StateProperty.php
old mode 100644
new mode 100755
diff --git a/app/Customization/Eloquent/Type.php b/app/Customization/Eloquent/Type.php
old mode 100644
new mode 100755
diff --git a/app/Events/AddGroupToRoleEvent.php b/app/Events/AddGroupToRoleEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/AddUserToRoleEvent.php b/app/Events/AddUserToRoleEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/DelGroupEvent.php b/app/Events/DelGroupEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/DelGroupFromRoleEvent.php b/app/Events/DelGroupFromRoleEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/DelUserEvent.php b/app/Events/DelUserEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/DelUserFromRoleEvent.php b/app/Events/DelUserFromRoleEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/DocumentEvent.php b/app/Events/DocumentEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/Event.php b/app/Events/Event.php
old mode 100644
new mode 100755
diff --git a/app/Events/FieldChangeEvent.php b/app/Events/FieldChangeEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/FieldDeleteEvent.php b/app/Events/FieldDeleteEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/FileDelEvent.php b/app/Events/FileDelEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/FileUploadEvent.php b/app/Events/FileUploadEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/IssueEvent.php b/app/Events/IssueEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/ModuleEvent.php b/app/Events/ModuleEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/PriorityConfigChangeEvent.php b/app/Events/PriorityConfigChangeEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/ResolutionConfigChangeEvent.php b/app/Events/ResolutionConfigChangeEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/SprintEvent.php b/app/Events/SprintEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/VersionEvent.php b/app/Events/VersionEvent.php
old mode 100644
new mode 100755
diff --git a/app/Events/WikiEvent.php b/app/Events/WikiEvent.php
old mode 100644
new mode 100755
diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php
index afaaea064..c18c43cc1 100644
--- a/app/Exceptions/Handler.php
+++ b/app/Exceptions/Handler.php
@@ -2,51 +2,40 @@
namespace App\Exceptions;
-use Exception;
-use Illuminate\Validation\ValidationException;
-use Illuminate\Auth\Access\AuthorizationException;
-use Illuminate\Database\Eloquent\ModelNotFoundException;
-use Symfony\Component\HttpKernel\Exception\HttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+use Throwable;
class Handler extends ExceptionHandler
{
/**
- * A list of the exception types that should not be reported.
+ * A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
- AuthorizationException::class,
- HttpException::class,
- ModelNotFoundException::class,
- ValidationException::class,
+ //
];
/**
- * Report or log an exception.
+ * A list of the inputs that are never flashed for validation exceptions.
*
- * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
- *
- * @param \Exception $e
- * @return void
+ * @var array
*/
- public function report(Exception $e)
- {
- parent::report($e);
- }
+ protected $dontFlash = [
+ 'current_password',
+ 'password',
+ 'password_confirmation',
+ ];
/**
- * Render an exception into an HTTP response.
+ * Register the exception handling callbacks for the application.
*
- * @param \Illuminate\Http\Request $request
- * @param \Exception $e
- * @return \Illuminate\Http\Response
+ * @return void
*/
- public function render($request, Exception $e)
+ public function register()
{
- $ecode = $e->getCode() ?: -99999;
- return [ 'ecode' => $ecode, 'emsg' => $e->getMessage() ];
- //return parent::render($request, $e);
+ $this->reportable(function (Throwable $e) {
+ //
+ });
}
}
diff --git a/app/Http/Controllers/AccessLogsController.php b/app/Http/Controllers/AccessLogsController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php
old mode 100644
new mode 100755
index 66fc1a4b8..00e36a5e9
--- a/app/Http/Controllers/ActivityController.php
+++ b/app/Http/Controllers/ActivityController.php
@@ -38,7 +38,7 @@ public function index(Request $request, $project_key)
$query->whereRaw([ 'issue_id' => [ '$exists' => 1 ] ]);
- $query->orderBy('_id', 'desc');
+ $query->orderBy('created_at', 'desc');
$limit = $request->input('limit');
if (!isset($limit))
@@ -49,8 +49,13 @@ public function index(Request $request, $project_key)
$avatars = [];
$activities = $query->get();
+ // $activities = $query->get();
+ $activities = $this->arr_fix($activities);
foreach ($activities as $key => $activity)
{
+ // $r = $activity;
+ // dump($r);
+ $activity = $this->arr_fix($activity);
if (!array_key_exists($activity['user']['id'], $avatars))
{
$user = Sentinel::findById($activity['user']['id']);
@@ -86,6 +91,8 @@ public function index(Request $request, $project_key)
{
$issue = DB::collection('issue_' . $project_key)->where('_id', $activity['data']['dest'])->first();
}
+ if(!$issue) continue;
+ $issue = $this->arr_fix($issue);
$activities[$key]['issue_link']['dest'] = [
'id' => $activity['data']['dest'],
'no' => $issue['no'],
@@ -103,6 +110,11 @@ public function index(Request $request, $project_key)
{
$issue = DB::collection('issue_' . $project_key)->where('_id', $activity['issue_id'])->first();
}
+ // dump($activity['issue_id']);
+ // dump($issue);
+ // exit;
+ if(!$issue) continue;
+ $issue = $this->arr_fix($issue);
$activities[$key]['issue'] = [
'id' => $activity['issue_id'],
'no' => $issue['no'],
diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php
old mode 100644
new mode 100755
index a100dd6ef..7afffc434
--- a/app/Http/Controllers/Auth/AuthController.php
+++ b/app/Http/Controllers/Auth/AuthController.php
@@ -2,7 +2,7 @@
namespace App\Http\Controllers\Auth;
-use App\User;
+use App\Models\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/BoardController.php b/app/Http/Controllers/BoardController.php
old mode 100644
new mode 100755
index 9d33eb7bc..ebc7bd2db
--- a/app/Http/Controllers/BoardController.php
+++ b/app/Http/Controllers/BoardController.php
@@ -71,6 +71,14 @@ public function index($project_key) {
->whereIn('status', [ 'active', 'waiting' ])
->orderBy('no', 'asc')
->get();
+ // compatible with old data
+ foreach ($sprints as $sprint)
+ {
+ if (!$sprint->name)
+ {
+ $sprint->name = 'Sprint ' . $sprint->no;
+ }
+ }
$epics = Epic::where('project_key', $project_key)
->orderBy('sn', 'asc')
diff --git a/app/Http/Controllers/CalendarController.php b/app/Http/Controllers/CalendarController.php
old mode 100644
new mode 100755
index 0896d0335..13dd0e1de
--- a/app/Http/Controllers/CalendarController.php
+++ b/app/Http/Controllers/CalendarController.php
@@ -223,7 +223,7 @@ public function sync(Request $request)
$year = intval($year);
- $url = 'http://www.actionview.cn:8080/api/holiday/' . $year;
+ $url = 'http://www.actionview.cn:8080/actionview/api/holiday/' . $year;
$res = CurlRequest::get($url);
if (!isset($res['ecode']) || $res['ecode'] != 0)
diff --git a/app/Http/Controllers/CommentsController.php b/app/Http/Controllers/CommentsController.php
old mode 100644
new mode 100755
index e2c253791..1108c051b
--- a/app/Http/Controllers/CommentsController.php
+++ b/app/Http/Controllers/CommentsController.php
@@ -58,7 +58,7 @@ public function store(Request $request, $project_key, $issue_id)
$id = DB::collection($table)->insertGetId(array_only($request->all(), [ 'contents', 'atWho' ]) + [ 'issue_id' => $issue_id, 'creator' => $creator, 'created_at' => time() ]);
// trigger event of comments added
- Event::fire(new IssueEvent($project_key, $issue_id, $creator, [ 'event_key' => 'add_comments', 'data' => array_only($request->all(), [ 'contents', 'atWho' ]) ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $creator, [ 'event_key' => 'add_comments', 'data' => array_only($request->all(), [ 'contents', 'atWho' ]) ]));
$comments = DB::collection($table)->find($id);
return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($comments) ]);
@@ -198,7 +198,7 @@ public function update(Request $request, $project_key, $issue_id, $id)
{
$event_key = 'edit_comments';
}
- Event::fire(new IssueEvent($project_key, $issue_id, $user, [ 'event_key' => $event_key, 'data' => $changedComments ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $user, [ 'event_key' => $event_key, 'data' => $changedComments ]));
return Response()->json([ 'ecode' => 0, 'data' => parent::arrange(DB::collection($table)->find($id)) ]);
}
@@ -227,7 +227,7 @@ public function destroy($project_key, $issue_id, $id)
$user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
// trigger the event of del comments
- Event::fire(new IssueEvent($project_key, $issue_id, $user, [ 'event_key' => 'del_comments', 'data' => array_only($comments, [ 'contents', 'atWho' ]) ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $user, [ 'event_key' => 'del_comments', 'data' => array_only($comments, [ 'contents', 'atWho' ]) ]));
return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
diff --git a/app/Http/Controllers/ConfigController.php b/app/Http/Controllers/ConfigController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
index d1a812d85..996cc032d 100644
--- a/app/Http/Controllers/Controller.php
+++ b/app/Http/Controllers/Controller.php
@@ -6,7 +6,6 @@
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
-use Illuminate\Foundation\Auth\Access\AuthorizesResources;
use App\Project\Eloquent\Project;
use App\Project\Eloquent\Watch;
@@ -19,15 +18,36 @@
class Controller extends BaseController
{
- use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
+ use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
+ public $user;
public function __construct()
{
- $this->user = Sentinel::getUser();
+
+ $this->middleware(function ($request, $next) {
+ $this->user = Sentinel::getUser();
+ return $next($request);
+ });
+
+ }
+
+ /**
+ * fix object to array
+ */
+ public function arr_fix($data){
+ if (!is_array($data)){
+ $newdata = json_decode(json_encode($data), true);
+ if($newdata===false) return $data;
+ $data= $newdata;
+ }
+ return $data;
}
public function arrange($data)
{
+
+ $data = $this->arr_fix($data);
+
if (!is_array($data))
{
return $data;
@@ -35,7 +55,7 @@ public function arrange($data)
if (array_key_exists('_id', $data))
{
- $data['_id'] = $data['_id'] instanceof ObjectID ? $data['_id']->__toString() : $data['_id'];
+ $data['_id'] = $data['_id'] instanceof ObjectID ? $data['_id']->__toString() : (isset($data['_id']) && isset($data['_id']['$oid']) ? $data['_id']['$oid'] :$data['_id']);
}
foreach ($data as $k => $val)
@@ -146,6 +166,11 @@ public function isFieldUsedByIssue($project_key, $field_key, $field, $ext_info='
})
->where('del_flg', '<>', 1)
->exists();
+ case 'labels':
+ return DB::collection('issue_' . $project_key)
+ ->where($field_key, $field['name'])
+ ->where('del_flg', '<>', 1)
+ ->exists();
default:
return true;
}
@@ -233,7 +258,7 @@ public function getIssueQueryWhere($project_key, $query)
$vals = explode(',', $val);
foreach ($vals as $v)
{
- $or[] = [ $key . '_ids' => $v ];
+ $or[] = [ $key . '_ids' => $v == 'me' ? $this->user->id : $v ];
}
$and[] = [ '$or' => $or ];
}
@@ -253,42 +278,69 @@ public function getIssueQueryWhere($project_key, $query)
}
else if (in_array($key_type_fields[$key], [ 'Duration', 'DatePicker', 'DateTimePicker' ]))
{
- if (strpos($val, '~') !== false)
+ if (in_array($val, [ '0d', '0w', '0m', '0y' ]))
{
- $sections = explode('~', $val);
- if ($sections[0])
+ if ($val == '0d')
{
- $and[] = [ $key => [ '$gte' => strtotime($sections[0]) ] ];
+ $and[] = [ $key => [ '$gte' => strtotime(date('Y-m-d')), '$lte' => strtotime(date('Y-m-d') . ' 23:59:59') ] ];
}
- if ($sections[1])
+ else if ($val == '0w')
+ {
+ $and[] = [ $key => [ '$gte' => mktime(0, 0, 0, date('m'), date('d') - date('w') + 1, date('Y')), '$lte' => mktime(23, 59, 59, date('m'), date('d') - date('w') + 7, date('Y')) ] ];
+ }
+ else if ($val == '0m')
+ {
+ $and[] = [ $key => [ '$gte' => mktime(0, 0, 0, date('m'), 1, date('Y')), '$lte' => mktime(23, 59, 59, date('m'), date('t'), date('Y')) ] ];
+ }
+ else
{
- $and[] = [ $key => [ '$lte' => strtotime($sections[1] . ' 23:59:59') ] ];
+ $and[] = [ $key => [ '$gte' => mktime(0, 0, 0, 1, 1, date('Y')), '$lte' => mktime(23, 59, 59, 12, 31, date('Y')) ] ];
}
}
else
{
- $unitMap = [ 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
- $unit = substr($val, -1);
- if (in_array($unit, [ 'w', 'm', 'y' ]))
+ $date_conds = [];
+ $unitMap = [ 'd' => 'day', 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
+ $sections = explode('~', $val);
+ if ($sections[0])
+ {
+ $v = $sections[0];
+ $unit = substr($v, -1);
+ if (in_array($unit, [ 'd', 'w', 'm', 'y' ]))
+ {
+ $direct = substr($v, 0, 1);
+ $vv = abs(substr($v, 0, -1));
+ $date_conds['$gte'] = strtotime(date('Ymd', strtotime(($direct === '-' ? '-' : '+') . $vv . ' ' . $unitMap[$unit])));
+ }
+ else
+ {
+ $date_conds['$gte'] = strtotime($v);
+ }
+ }
+
+ if (isset($sections[1]) && $sections[1])
{
- $direct = substr($val, 0, 1);
- $val = abs(substr($val, 0, -1));
- if ($direct === '-')
+ $v = $sections[1];
+ $unit = substr($v, -1);
+ if (in_array($unit, [ 'd', 'w', 'm', 'y' ]))
{
- $and[] = [ $key => [ '$lt' => strtotime(date('Ymd', strtotime('-' . $val . ' ' . $unitMap[$unit]))) ] ];
+ $direct = substr($v, 0, 1);
+ $vv = abs(substr($v, 0, -1));
+ $date_conds['$lte'] = strtotime(date('Y-m-d', strtotime(($direct === '-' ? '-' : '+') . $vv . ' ' . $unitMap[$unit])) . ' 23:59:59');
}
else
{
- $and[] = [ $key => [ '$gte' => strtotime(date('Ymd', strtotime('-' . $val . ' ' . $unitMap[$unit]))) ] ];
+ $date_conds['$lte'] = strtotime($v . ' 23:59:59');
}
}
+ $and[] = [ $key => $date_conds ];
}
}
- else if (in_array($key_type_fields[$key], [ 'Text', 'TextArea', 'Url' ]))
+ else if (in_array($key_type_fields[$key], [ 'Text', 'TextArea', 'RichTextEditor', 'Url' ]))
{
$and[] = [ $key => [ '$regex' => $val ] ];
}
- else if ($key_type_fields[$key] === 'Number')
+ else if (in_array($key_type_fields[$key], [ 'Number', 'Integer' ]))
{
if (strpos($val, '~') !== false)
{
diff --git a/app/Http/Controllers/DirectoryController.php b/app/Http/Controllers/DirectoryController.php
old mode 100644
new mode 100755
index 7cca94f2e..3b995e345
--- a/app/Http/Controllers/DirectoryController.php
+++ b/app/Http/Controllers/DirectoryController.php
@@ -380,14 +380,14 @@ public function destroy($id)
foreach ($groups as $group)
{
$group->delete();
- Event::fire(new DelGroupEvent($group->id));
+ Event::dispatch(new DelGroupEvent($group->id));
}
$users = EloquentUser::where('directory', $id)->get();
foreach ($users as $user)
{
$user->delete();
- Event::fire(new DelUserEvent($user->id));
+ Event::dispatch(new DelUserEvent($user->id));
}
Directory::destroy($id);
diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php
old mode 100644
new mode 100755
index 94cd2bfeb..b38d30236
--- a/app/Http/Controllers/DocumentController.php
+++ b/app/Http/Controllers/DocumentController.php
@@ -7,10 +7,14 @@
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Events\DocumentEvent;
+use App\Project\Eloquent\DocumentFavorites;
use App\Acl\Acl;
use DB;
use App\Utils\File;
+use App\Utils\File as FileUtil;
+use App\Models\Files as FilesModel;
+use MongoDB\BSON\ObjectID;
use Zipper;
class DocumentController extends Controller
@@ -24,14 +28,12 @@ class DocumentController extends Controller
public function searchPath(Request $request, $project_key)
{
$s = $request->input('s');
- if (!$s)
- {
+ if (!$s) {
return Response()->json(['ecode' => 0, 'data' => []]);
}
- if ($s === '/')
- {
- return Response()->json(['ecode' => 0, 'data' => [ [ 'id' => '0', 'name' => '/' ] ] ]);
+ if ($s === '/') {
+ return Response()->json(['ecode' => 0, 'data' => [['id' => '0', 'name' => '/']]]);
}
$query = DB::collection('document_' . $project_key)
@@ -40,8 +42,7 @@ public function searchPath(Request $request, $project_key)
->where('name', 'like', '%' . $s . '%');
$moved_path = $request->input('moved_path');
- if (isset($moved_path) && $moved_path)
- {
+ if (isset($moved_path) && $moved_path) {
$query->where('pt', '<>', $moved_path);
$query->where('_id', '<>', $moved_path);
}
@@ -49,31 +50,120 @@ public function searchPath(Request $request, $project_key)
$directories = $query->take(20)->get(['name', 'pt']);
$ret = [];
- foreach ($directories as $d)
- {
+ foreach ($directories as $d) {
$parents = [];
$path = '';
$ps = DB::collection('document_' . $project_key)
->whereIn('_id', $d['pt'])
- ->get([ 'name' ]);
- foreach ($ps as $val)
- {
+ ->get(['name']);
+ foreach ($ps as $val) {
$parents[$val['_id']->__toString()] = $val['name'];
}
- foreach ($d['pt'] as $pid)
- {
- if (isset($parents[$pid]))
- {
+ foreach ($d['pt'] as $pid) {
+ if (isset($parents[$pid])) {
$path .= '/' . $parents[$pid];
}
}
$path .= '/' . $d['name'];
- $ret[] = [ 'id' => $d['_id']->__toString(), 'name' => $path ];
+ $ret[] = ['id' => $d['_id']->__toString(), 'name' => $path];
}
return Response()->json(['ecode' => 0, 'data' => parent::arrange($ret)]);
}
+ /**
+ * get the directory children.
+ * @param string $project_key
+ * @param string $directory
+ * @return \Illuminate\Http\Response
+ */
+ public function getDirChildren(Request $request, $project_key, $directory)
+ {
+ $sub_dirs = DB::collection('document_' . $project_key)
+ ->where('parent', $directory)
+ ->where('d', 1)
+ ->where('del_flag', '<>', 1)
+ ->get();
+
+ $res = [];
+ foreach ($sub_dirs as $val) {
+ $res[] = ['id' => $val['_id']->__toString(), 'name' => $val['name']];
+ }
+
+ return Response()->json(['ecode' => 0, 'data' => $res]);
+ }
+
+ /**
+ * get the directory tree.
+ * @param string $project_key
+ * @return \Illuminate\Http\Response
+ */
+ public function getDirTree(Request $request, $project_key)
+ {
+ $dt = ['id' => '0', 'name' => '根目录'];
+
+ $curdir = $request->input('currentdir');
+ if (!$curdir) {
+ $curdir = '0';
+ }
+
+ $pt = ['0'];
+ if ($curdir !== '0') {
+ $node = DB::collection('document_' . $project_key)
+ ->where('_id', $curdir)
+ ->first();
+
+ if ($node) {
+ $pt = $node['pt'];
+ array_push($pt, $curdir);
+ }
+ }
+
+ foreach ($pt as $val) {
+ $sub_dirs = DB::collection('document_' . $project_key)
+ ->where('parent', $val)
+ ->where('d', 1)
+ ->where('del_flag', '<>', 1)
+ ->get();
+
+ $this->addChildren2Tree($dt, $val, $sub_dirs);
+ }
+
+ return Response()->json(['ecode' => 0, 'data' => $dt]);
+ }
+
+ /**
+ * add children to tree.
+ *
+ * @param array $dt
+ * @param string $parent_id
+ * @param array $sub_dirs
+ * @return void
+ */
+ public function addChildren2Tree(&$dt, $parent_id, $sub_dirs)
+ {
+ $new_dirs = [];
+ foreach ($sub_dirs as $val) {
+ $new_dirs[] = ['id' => $val['_id']->__toString(), 'name' => $val['name']];
+ }
+
+ if ($dt['id'] == $parent_id) {
+ $dt['children'] = $new_dirs;
+ return true;
+ } else {
+ if (isset($dt['children']) && $dt['children']) {
+ $children_num = count($dt['children']);
+ for ($i = 0; $i < $children_num; $i++) {
+ $res = $this->addChildren2Tree($dt['children'][$i], $parent_id, $sub_dirs);
+ if ($res === true) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+
/**
* Display a listing of the resource.
*
@@ -82,11 +172,11 @@ public function searchPath(Request $request, $project_key)
public function getOptions(Request $request, $project_key)
{
$uploaders = DB::collection('document_' . $project_key)
- ->where('del_flag', '<>' , 1)
+ ->where('del_flag', '<>', 1)
->distinct('uploader')
- ->get([ 'uploader' ]);
+ ->get(['uploader']);
- return Response()->json(['ecode' => 0, 'data' => [ 'uploader' => $uploaders ]]);
+ return Response()->json(['ecode' => 0, 'data' => ['uploader' => $uploaders]]);
}
/**
@@ -101,37 +191,47 @@ public function index(Request $request, $project_key, $directory)
$query = DB::collection('document_' . $project_key);
$uploader_id = $request->input('uploader_id');
- if (isset($uploader_id) && $uploader_id)
- {
+ if (isset($uploader_id) && $uploader_id) {
$mode = 'search';
- $query->where('uploader.id', $uploader_id);
+ $query->where('uploader.id', $uploader_id == 'me' ? $this->user->id : $uploader_id);
}
$name = $request->input('name');
- if (isset($name) && $name)
- {
+ if (isset($name) && $name) {
$mode = 'search';
$query = $query->where('name', 'like', '%' . $name . '%');
}
$uploaded_at = $request->input('uploaded_at');
- if (isset($uploaded_at) && $uploaded_at)
- {
+ if (isset($uploaded_at) && $uploaded_at) {
$mode = 'search';
- $unitMap = [ 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
+ $unitMap = ['w' => 'week', 'm' => 'month', 'y' => 'year'];
$unit = substr($uploaded_at, -1);
$val = abs(substr($uploaded_at, 0, -1));
$query->where('uploaded_at', '>=', strtotime(date('Ymd', strtotime('-' . $val . ' ' . $unitMap[$unit]))));
}
- if ($directory !== '0')
- {
- $query = $query->where($mode === 'search' ? 'pt' : 'parent', $directory);
+ $favorite_documents = DocumentFavorites::where('project_key', $project_key)
+ ->where('user.id', $this->user->id)
+ ->get()
+ ->toArray();
+ $favorite_dids = array_column($favorite_documents, 'did');
+
+ $myfavorite = $request->input('myfavorite');
+ if (isset($myfavorite) && $myfavorite == '1') {
+ $mode = 'search';
+ $favoritedIds = [];
+ foreach ($favorite_dids as $did) {
+ $favoritedIds[] = new ObjectID($did);
+ }
+
+ $query->whereIn('_id', $favoritedIds);
}
- else
- {
- if ($mode === 'list')
- {
+
+ if ($directory !== '0') {
+ $query = $query->where($mode === 'search' ? 'pt' : 'parent', $directory);
+ } else {
+ if ($mode === 'list') {
$query = $query->where('parent', $directory);
}
}
@@ -142,41 +242,41 @@ public function index(Request $request, $project_key, $directory)
$limit = 1000; // fix me
$query->take($limit);
$documents = $query->get();
+ if (!$documents) $documents = [];
- $path = [];
- if ($directory === '0')
- {
- $path[] = [ 'id' => '0', 'name' => 'root' ];
+ foreach ($documents as $k => $d) {
+ if (in_array($d['_id']->__toString(), $favorite_dids)) {
+ $documents[$k]['favorited'] = true;
+ }
}
- else
- {
- $path[] = [ 'id' => '0', 'name' => 'root' ];
+
+ $path = [];
+ if ($directory === '0') {
+ $path[] = ['id' => '0', 'name' => 'root'];
+ } else {
+ $path[] = ['id' => '0', 'name' => 'root'];
$d = DB::collection('document_' . $project_key)
->where('_id', $directory)
->first();
- if ($d && isset($d['pt']))
- {
+ if ($d && isset($d['pt'])) {
$parents = [];
$ps = DB::collection('document_' . $project_key)
->whereIn('_id', $d['pt'])
- ->get([ 'name' ]);
- foreach ($ps as $val)
- {
+ ->get(['name']);
+ foreach ($ps as $val) {
$parents[$val['_id']->__toString()] = $val['name'];
}
- foreach ($d['pt'] as $pid)
- {
- if (isset($parents[$pid]))
- {
- $path[] = [ 'id' => $pid, 'name' => $parents[$pid] ];
+ foreach ($d['pt'] as $pid) {
+ if (isset($parents[$pid])) {
+ $path[] = ['id' => $pid, 'name' => $parents[$pid]];
}
}
}
- $path[] = [ 'id' => $directory, 'name' => $d['name'] ];
+ $path[] = ['id' => $directory, 'name' => $d['name']];
}
- return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($documents), 'options' => [ 'path' => $path ] ]);
+ return Response()->json(['ecode' => 0, 'data' => parent::arrange($documents), 'options' => ['path' => $path]]);
}
/**
@@ -191,28 +291,24 @@ public function createFolder(Request $request, $project_key)
$insValues = [];
$parent = $request->input('parent');
- if (!isset($parent))
- {
+ if (!isset($parent)) {
throw new \UnexpectedValueException('the parent directory can not be empty.', -11905);
}
$insValues['parent'] = $parent;
- if ($parent !== '0')
- {
+ if ($parent !== '0') {
$isExists = DB::collection('document_' . $project_key)
->where('_id', $parent)
->where('d', 1)
->where('del_flag', '<>', 1)
->exists();
- if (!$isExists)
- {
+ if (!$isExists) {
throw new \UnexpectedValueException('the parent directory does not exist.', -11906);
}
}
$name = $request->input('name');
- if (!isset($name) || !$name)
- {
+ if (!isset($name) || !$name) {
throw new \UnexpectedValueException('the name can not be empty.', -11900);
}
$insValues['name'] = $name;
@@ -223,14 +319,13 @@ public function createFolder(Request $request, $project_key)
->where('d', 1)
->where('del_flag', '<>', 1)
->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11901);
}
$insValues['pt'] = $this->getParentTree($project_key, $parent);
$insValues['d'] = 1;
- $insValues['creator'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $insValues['creator'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$insValues['created_at'] = time();
$id = DB::collection('document_' . $project_key)->insertGetId($insValues);
@@ -248,16 +343,13 @@ public function createFolder(Request $request, $project_key)
public function getParentTree($project_key, $directory)
{
$pt = [];
- if ($directory === '0')
- {
- $pt = [ '0' ];
- }
- else
- {
+ if ($directory === '0') {
+ $pt = ['0'];
+ } else {
$d = DB::collection('document_' . $project_key)
->where('_id', $directory)
->first();
- $pt = array_merge($d['pt'], [ $directory ]);
+ $pt = array_merge($d['pt'], [$directory]);
}
return $pt;
}
@@ -273,8 +365,7 @@ public function getParentTree($project_key, $directory)
public function update(Request $request, $project_key, $id)
{
$name = $request->input('name');
- if (!isset($name) || !$name)
- {
+ if (!isset($name) || !$name) {
throw new \UnexpectedValueException('the name can not be empty.', -11900);
}
@@ -282,51 +373,40 @@ public function update(Request $request, $project_key, $id)
->where('_id', $id)
->where('del_flag', '<>', 1)
->first();
- if (!$old_document)
- {
+ if (!$old_document) {
throw new \UnexpectedValueException('the object does not exist.', -11902);
}
- if (isset($old_document['d']) && $old_document['d'] === 1)
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project'))
- {
+ if (isset($old_document['d']) && $old_document['d'] === 1) {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
- }
- else
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project') && $old_document['uploader']['id'] !== $this->user->id)
- {
+ } else {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project') && $old_document['uploader']['id'] !== $this->user->id) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
}
- if ($old_document['name'] !== $name)
- {
+ if ($old_document['name'] !== $name) {
$query = DB::collection('document_' . $project_key)
->where('parent', $old_document['parent'])
->where('name', $name)
->where('del_flag', '<>', 1);
- if (isset($old_document['d']) && $old_document['d'] === 1)
- {
+ if (isset($old_document['d']) && $old_document['d'] === 1) {
$query->where('d', 1);
- }
- else
- {
+ } else {
$query->where('d', '<>', 1);
}
$isExists = $query->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11901);
}
}
- DB::collection('document_' . $project_key)->where('_id', $id)->update([ 'name' => $name ]);
+ DB::collection('document_' . $project_key)->where('_id', $id)->update(['name' => $name]);
$new_document = DB::collection('document_' . $project_key)->where('_id', $id)->first();
return Response()->json(['ecode' => 0, 'data' => parent::arrange($new_document)]);
@@ -342,14 +422,12 @@ public function update(Request $request, $project_key, $id)
public function move(Request $request, $project_key)
{
$id = $request->input('id');
- if (!isset($id) || !$id)
- {
+ if (!isset($id) || !$id) {
throw new \UnexpectedValueException('the move object can not be empty.', -11911);
}
$dest_path = $request->input('dest_path');
- if (!isset($dest_path))
- {
+ if (!isset($dest_path)) {
throw new \UnexpectedValueException('the dest directory can not be empty.', -11912);
}
@@ -357,36 +435,28 @@ public function move(Request $request, $project_key)
->where('_id', $id)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the move object does not exist.', -11913);
}
- if (isset($document['d']) && $document['d'] === 1)
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project'))
- {
+ if (isset($document['d']) && $document['d'] === 1) {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
- }
- else
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project') && $document['uploader']['id'] !== $this->user->id)
- {
+ } else {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project') && $document['uploader']['id'] !== $this->user->id) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
}
$dest_directory = [];
- if ($dest_path !== '0')
- {
+ if ($dest_path !== '0') {
$dest_directory = DB::collection('document_' . $project_key)
->where('_id', $dest_path)
->where('d', 1)
->where('del_flag', '<>', 1)
->first();
- if (!$dest_directory)
- {
+ if (!$dest_directory) {
throw new \UnexpectedValueException('the dest directory does not exist.', -11914);
}
}
@@ -397,8 +467,7 @@ public function move(Request $request, $project_key)
->where('d', isset($document['d']) && $document['d'] === 1 ? '=' : '<>', 1)
->where('del_flag', '<>', 1)
->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11901);
}
@@ -407,23 +476,20 @@ public function move(Request $request, $project_key)
$updValues['pt'] = array_merge(isset($dest_directory['pt']) ? $dest_directory['pt'] : [], [$dest_path]);
DB::collection('document_' . $project_key)->where('_id', $id)->update($updValues);
- if (isset($document['d']) && $document['d'] === 1)
- {
+ if (isset($document['d']) && $document['d'] === 1) {
$subs = DB::collection('document_' . $project_key)
->where('pt', $id)
->where('del_flag', '<>', 1)
->get();
- foreach ($subs as $sub)
- {
- $pt = isset($sub['pt']) ? $sub['pt'] : [];
- $pind = array_search($id, $pt);
- if ($pind !== false)
- {
- $tail = array_slice($pt, $pind);
- $pt = array_merge($updValues['pt'], $tail);
- DB::collection('document_' . $project_key)->where('_id', $sub['_id']->__toString())->update(['pt' => $pt]);
- }
- }
+ foreach ($subs as $sub) {
+ $pt = isset($sub['pt']) ? $sub['pt'] : [];
+ $pind = array_search($id, $pt);
+ if ($pind !== false) {
+ $tail = array_slice($pt, $pind);
+ $pt = array_merge($updValues['pt'], $tail);
+ DB::collection('document_' . $project_key)->where('_id', $sub['_id']->__toString())->update(['pt' => $pt]);
+ }
+ }
}
$document = DB::collection('document_' . $project_key)->where('_id', $id)->first();
@@ -441,35 +507,29 @@ public function destroy($project_key, $id)
{
$document = DB::collection('document_' . $project_key)
->where('_id', $id)
+ ->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11902);
}
- if (isset($document['d']) && $document['d'] === 1)
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project'))
- {
+ if (isset($document['d']) && $document['d'] === 1) {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
- }
- else
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project') && $document['uploader']['id'] !== $this->user->id)
- {
+ } else {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project') && $document['uploader']['id'] !== $this->user->id) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
}
- DB::collection('document_' . $project_key)->where('_id', $id)->update([ 'del_flag' => 1 ]);
+ DB::collection('document_' . $project_key)->where('_id', $id)->update(['del_flag' => 1]);
- if (isset($document['d']) && $document['d'] === 1)
- {
- DB::collection('document_' . $project_key)->whereRaw([ 'pt' => $id ])->update([ 'del_flag' => 1 ]);
+ if (isset($document['d']) && $document['d'] === 1) {
+ DB::collection('document_' . $project_key)->whereRaw(['pt' => $id])->update(['del_flag' => 1]);
}
- return Response()->json(['ecode' => 0, 'data' => [ 'id' => $id ]]);
+ return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
/**
@@ -483,109 +543,124 @@ public function destroy($project_key, $id)
public function upload(Request $request, $project_key, $directory)
{
set_time_limit(0);
+ ignore_user_abort(true);
+ FilesModel::setProjectKey($project_key);
- if (!is_writable(config('filesystems.disks.local.root', '/tmp')))
- {
- throw new \UnexpectedValueException('the user has not the writable permission to the directory.', -15103);
- }
-
- if ($directory !== '0')
- {
+ if ($directory !== '0') {
$isExists = DB::collection('document_' . $project_key)
->where('_id', $directory)
->where('d', 1)
->where('del_flag', '<>', 1)
->exists();
- if (!$isExists)
- {
+ if (!$isExists) {
throw new \UnexpectedValueException('the parent directory does not exist.', -11905);
}
}
$fields = array_keys($_FILES);
$field = array_pop($fields);
- if (empty($_FILES) || $_FILES[$field]['error'] > 0)
- {
+ $file = $request->file($field);
+ if (!$file->isValid()) {
throw new \UnexpectedValueException('upload file errors.', -11903);
}
- $basename = md5(microtime() . $_FILES[$field]['name']);
- $sub_save_path = config('filesystems.disks.local.root', '/tmp') . '/' . substr($basename, 0, 2) . '/';
- if (!is_dir($sub_save_path))
- {
- @mkdir($sub_save_path);
- }
- move_uploaded_file($_FILES[$field]['tmp_name'], $sub_save_path . $basename);
+ $extname = $file->guessExtension();
+ $info = new \SplFileInfo($file->getClientOriginalName());
+ $fname = $info->getBasename("." . $extname);
+ $basename = FilesModel::basePath($file->getClientOriginalName());
+ $sub_save_path = FilesModel::absPath(null);
+ $filename = $sub_save_path . $basename;
$data = [];
+ $data['pt'] = $this->getParentTree($project_key, $directory);
+ $data['parent'] = $directory;
+ $data['size'] = $file->getSize();
+ $data['type'] = $file->getClientMimeType();
+ $data['index'] = $basename;
+ $data['uploader'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
+ $data['uploaded_at'] = time();
- $fname = $_FILES[$field]['name'];
- $extname = '';
- $segments = explode('.', $fname);
- if (count($segments) > 1)
- {
- $extname = '.' . array_pop($segments);
- $fname = implode('.', $segments);
+ $uploaded = FilesModel::saveTo($file, $filename);
+ if (!$uploaded) {
+ throw new \UnexpectedValueException('save file with error.', -11903);
}
+
+
+ $thumbnail_size = 200;
+ $thumbmail_index = FilesModel::makeThumbIndex($filename, $basename, $thumbnail_size);
+ if ($thumbmail_index) {
+ $data['thumbnails_index'] = $thumbmail_index;
+ }
+
$i = 1;
- while(true)
- {
+ while (true) {
$isExists = DB::collection('document_' . $project_key)
->where('parent', $directory)
- ->where('name', $fname . ($i < 2 ? '' : ('(' . $i . ')')) . $extname)
+ ->where('name', $fname . ($i < 2 ? '' : ('(' . $i . ')')) . '.' . $extname)
->where('d', '<>', 1)
->where('del_flag', '<>', 1)
->exists();
- if (!$isExists)
- {
+ if (!$isExists) {
break;
}
- $i++;
+ $i++;
}
- $data['name'] = $fname . ($i < 2 ? '' : ('(' . $i . ')')) . $extname;
-
- $data['pt'] = $this->getParentTree($project_key, $directory);
- $data['parent'] = $directory;
- $data['size'] = $_FILES[$field]['size'];
- $data['type'] = $_FILES[$field]['type'];
- $data['index'] = $basename;
-
- $data['uploader'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- $data['uploaded_at'] = time();
-
+ $data['name'] = $fname . ($i < 2 ? '' : ('(' . $i . ')')) . '.' . $extname;
$id = DB::collection('document_' . $project_key)->insertGetId($data);
$document = DB::collection('document_' . $project_key)->where('_id', $id)->first();
-
return Response()->json(['ecode' => 0, 'data' => parent::arrange($document)]);
}
/**
- * Download file or directory.
+ * Download Thumbnails file.
*
* @param \Illuminate\Http\Request $request
* @param String $project_key
* @param String $id
* @return \Illuminate\Http\Response
*/
- public function download(Request $request, $project_key, $id)
+ public function downloadThumbnails(Request $request, $project_key, $id)
{
set_time_limit(0);
$document = DB::collection('document_' . $project_key)
->where('_id', $id)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11902);
}
- if (isset($document['d']) && $document['d'] === 1)
- {
- $this->downloadFolder($project_key, $document['name'], $id);
+ $filepath = config('filesystems.disks.local.root', '/tmp') . '/' . substr($document['index'], 0, 2);
+ $filename = $filepath . '/' . $document['thumbnails_index'];
+ if (!file_exists($filename)) {
+ throw new \UnexpectedValueException('file does not exist.', -11904);
+ }
+
+ File::download($filename, $document['name']);
+ }
+
+ /**
+ * Download file or directory.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param String $project_key
+ * @param String $id
+ * @return \Illuminate\Http\Response
+ */
+ public function download(Request $request, $project_key, $id, $name = '')
+ {
+ set_time_limit(0);
+
+ $document = DB::collection('document_' . $project_key)
+ ->where('_id', $id)
+ ->first();
+ if (!$document || (isset($document['del_flg']) && $document['del_flg'] == 1)) {
+ throw new \UnexpectedValueException('the object does not exist.', -11902);
}
- else
- {
- $this->downloadFile($document['name'], $document['index']);
+ if (isset($document['d']) && $document['d'] === 1) {
+ return $this->downloadFolder($project_key, $document['name'], $id);
+ } else {
+ return $this->downloadFile($document, !!$name);
}
}
@@ -598,21 +673,16 @@ public function download(Request $request, $project_key, $id)
*/
public function downloadFolder($project_key, $name, $directory)
{
- setlocale(LC_ALL, 'zh_CN.UTF-8');
-
+ setlocale(LC_ALL, 'zh_CN.UTF-8');
$basepath = '/tmp/' . md5($this->user->id . microtime());
@mkdir($basepath);
-
$this->contructFolder($project_key, $basepath . '/' . $name, $directory);
-
$filename = $basepath . '/' . $name . '.zip';
-
- Zipper::make($filename)->folder($name)->add($basepath . '/' . $name);
- Zipper::close();
-
+ $zipper = new Zipper();
+ $zipper->make($filename)->folder($name)->add($basepath . '/' . $name);
+ $zipper->close();
File::download($filename, $name . '.zip');
-
- exec('rm -rf ' . $basepath);
+ FilesModel::rmdir($basepath);
}
/**
@@ -624,25 +694,29 @@ public function downloadFolder($project_key, $name, $directory)
*/
public function contructFolder($project_key, $fullpath, $id)
{
- @mkdir($fullpath);
+ @mkdir($fullpath);
$documents = DB::collection('document_' . $project_key)
->where('parent', $id)
->where('del_flag', '<>', 1)
->get();
- foreach ($documents as $doc)
- {
- if (isset($doc['d']) && $doc['d'] === 1)
- {
+
+ foreach ($documents as $doc) {
+ if (isset($doc['d']) && $doc['d'] === 1) {
$this->contructFolder($project_key, $fullpath . '/' . $doc['name'], $doc['_id']->__toString());
- }
- else
- {
- $filepath = config('filesystems.disks.local.root', '/tmp') . '/' . substr($doc['index'], 0, 2);
- $filename = $filepath . '/' . $doc['index'];
- if (file_exists($filename))
- {
- @copy($filename, $fullpath . '/' . $doc['name']);
+ } else {
+ $filename = FilesModel::absPath($doc['index']);
+ if (FilesModel::defaultDisk() == 'local') {
+ if (file_exists($filename)) {
+ @copy($filename, $fullpath . '/' . $doc['name']);
+ }
+ } else {
+ $disk = FilesModel::disk();
+ $exists = $disk->has($filename);
+ if ($exists) {
+ $contents = $disk->read($filename);
+ file_put_contents(FilesModel::absPath($fullpath . '/' . $doc['name'], true), $contents);
+ }
}
}
}
@@ -655,15 +729,60 @@ public function contructFolder($project_key, $fullpath, $id)
* @param String $index
* @return \Illuminate\Http\Response
*/
- public function downloadFile($name, $index)
+ public function downloadFile($file, $isPdfPreview)
{
- $filepath = config('filesystems.disks.local.root', '/tmp') . '/' . substr($index, 0, 2);
- $filename = $filepath . '/' . $index;
- if (!file_exists($filename))
- {
- throw new \UnexpectedValueException('file does not exist.', -11904);
+ // $filename = FilesModel::absPath($index);
+ // if (FilesModel::defaultDisk()=='local' && !file_exists($filename)) {
+ // throw new \UnexpectedValueException('file does not exist.', -11904);
+ // }
+ // $fileData = pathinfo($name);
+ // if (strtolower($fileData['extension']) == 'pdf' && $isPdfPreview) {
+ // File::pdfPreview($filename, $name);
+ // } else {
+ // File::download($filename, $name);
+ // }
+ if (FilesModel::defaultDisk() == 'local') {
+ $filename = FilesModel::absPath($file['index']);
+ if (!file_exists($filename)) {
+ throw new \UnexpectedValueException('file does not exist.', -15100);
+ }
+ if ($file->type == 'application/pdf' && $isPdfPreview) {
+ FileUtil::pdfPreview($filename, $file['name']);
+ } else {
+ FileUtil::download($filename, $file['name']);
+ }
+ } else {
+ $url = FilesModel::disk()->getUrl($file['index']);
+ return redirect($url);
+ }
+ }
+
+ /**
+ * favorite action.
+ *
+ * @param string $project_key
+ * @param string $id
+ * @return \Illuminate\Http\Response
+ */
+ public function favorite(Request $request, $project_key, $id)
+ {
+ $document = DB::collection('document_' . $project_key)
+ ->where('_id', $id)
+ ->where('del_flag', '<>', 1)
+ ->first();
+ if (!$document) {
+ throw new \UnexpectedValueException('the object does not exist.', -11902);
+ }
+
+ DocumentFavorites::where('did', $id)->where('user.id', $this->user->id)->delete();
+
+ $cur_user = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
+
+ $flag = $request->input('flag');
+ if (isset($flag) && $flag) {
+ DocumentFavorites::create(['project_key' => $project_key, 'did' => $id, 'user' => $cur_user]);
}
- File::download($filename, $name);
+ return Response()->json(['ecode' => 0, 'data' => ['id' => $id, 'user' => $cur_user, 'favorited' => $flag]]);
}
}
diff --git a/app/Http/Controllers/EpicController.php b/app/Http/Controllers/EpicController.php
old mode 100644
new mode 100755
index 7c80e27f1..8af67054f
--- a/app/Http/Controllers/EpicController.php
+++ b/app/Http/Controllers/EpicController.php
@@ -282,7 +282,7 @@ public function updIssueEpic($project_key, $source, $dest)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $issue_id, [], [ 'epic' ]);
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
}
}
}
diff --git a/app/Http/Controllers/EventsController.php b/app/Http/Controllers/EventsController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/ExcelTrait.php b/app/Http/Controllers/ExcelTrait.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/ExternalUsersController.php b/app/Http/Controllers/ExternalUsersController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/FieldController.php b/app/Http/Controllers/FieldController.php
old mode 100644
new mode 100755
index f27c023f8..209de461c
--- a/app/Http/Controllers/FieldController.php
+++ b/app/Http/Controllers/FieldController.php
@@ -52,6 +52,13 @@ class FieldController extends Controller
'orderBy',
'stat_x',
'stat_y',
+ 'stat_time',
+ 'stat_dimension',
+ 'is_accu',
+ 'interval',
+ 'recorded_at',
+ 'scale',
+ 'requested_at',
];
private $sys_fields = [
@@ -77,9 +84,11 @@ class FieldController extends Controller
private $all_types = [
'Tags',
+ 'Integer',
'Number',
'Text',
'TextArea',
+ 'RichTextEditor',
'Select',
'MultiSelect',
'RadioGroup',
@@ -303,9 +312,35 @@ public function update(Request $request, $project_key, $id)
}
}
+ $mmTypes = [ 'Number', 'Integer' ];
+ if (in_array($field->type, $mmTypes))
+ {
+ $maxValue = $request->input('maxValue');
+ if (isset($maxValue))
+ {
+ $updValues['maxValue'] = ($maxValue === '' ? '' : ($maxValue + 0));
+ }
+
+ $minValue = $request->input('minValue');
+ if (isset($minValue))
+ {
+ $updValues['minValue'] = ($minValue === '' ? '' : ($minValue + 0));
+ }
+ }
+
+ $mlTypes = [ 'Text', 'TextArea', 'RichTextEditor' ];
+ if (in_array($field->type, $mlTypes))
+ {
+ $maxLength = $request->input('maxLength');
+ if (isset($maxLength))
+ {
+ $updValues['maxLength'] = ($maxLength === '' ? '' : intval($maxLength));
+ }
+ }
+
$field->fill($updValues + $request->except(['project_key', 'key', 'type']))->save();
- Event::fire(new FieldChangeEvent($id));
+ Event::dispatch(new FieldChangeEvent($id));
return Response()->json(['ecode' => 0, 'data' => Field::find($id)]);
}
@@ -337,7 +372,7 @@ public function destroy($project_key, $id)
Field::destroy($id);
- Event::fire(new FieldDeleteEvent($project_key, $id, $field->key, $field->type));
+ Event::dispatch(new FieldDeleteEvent($project_key, $id, $field->key, $field->type));
return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
diff --git a/app/Http/Controllers/FileController.php b/app/Http/Controllers/FileController.php
old mode 100644
new mode 100755
index 882c60f0f..09d96f784
--- a/app/Http/Controllers/FileController.php
+++ b/app/Http/Controllers/FileController.php
@@ -1,4 +1,5 @@
0)
- {
- throw new \UnexpectedValueException('upload file errors.', -15101);
- }
+ foreach ($_FILES as $field => $tmpfile) {
+ if ($tmpfile['error'] > 0) {
+ continue;
+ }
- $basename = md5(microtime() . $_FILES[$field]['name']);
- $sub_save_path = config('filesystems.disks.local.root', '/tmp') . '/' . substr($basename, 0, 2) . '/';
- if (!is_dir($sub_save_path))
- {
- @mkdir($sub_save_path);
- }
- $filename = '/tmp/' . $basename;
- move_uploaded_file($_FILES[$field]['tmp_name'], $filename);
- $data = [];
- $data['name'] = $_FILES[$field]['name'];
- $data['size'] = $_FILES[$field]['size'];
- $data['type'] = $_FILES[$field]['type'];
- $data['index'] = $basename;
- if ($_FILES[$field]['type'] == 'image/jpeg' || $_FILES[$field]['type'] == 'image/jpg' || $_FILES[$field]['type'] == 'image/png' || $_FILES[$field]['type'] == 'image/gif')
- {
- $size = getimagesize($filename);
- $width = $size[0]; $height = $size[1];
- $scale = $width < $height ? $height : $width;
- $thumbnails_width = floor($thumbnail_size * $width / $scale);
- $thumbnails_height = floor($thumbnail_size * $height / $scale);
- $thumbnails_filename = $filename . '_thumbnails';
- if ($scale <= $thumbnail_size)
- {
- @copy($filename, $thumbnails_filename);
+ $file = $request->file($field);
+ if (!$file->isValid()) {
+ continue;
}
- else if ($_FILES[$field]['type'] == 'image/jpeg' || $_FILES[$field]['type'] == 'image/jpg')
- {
- $src_image = imagecreatefromjpeg($filename);
- $dst_image = imagecreatetruecolor($thumbnails_width, $thumbnails_height);
- imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $thumbnails_width, $thumbnails_height, $width, $height);
- imagejpeg($dst_image, $thumbnails_filename);
+ $content = file_get_contents($file->getPathname());
+ if(!$content){
+ continue;
}
- else if ($_FILES[$field]['type'] == 'image/png')
- {
- $src_image = imagecreatefrompng($filename);
- $dst_image = imagecreatetruecolor($thumbnails_width, $thumbnails_height);
- imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $thumbnails_width, $thumbnails_height, $width, $height);
- imagepng($dst_image, $thumbnails_filename);
+
+ $ext = $file->guessExtension();
+ $basename = FilesModel::basePath($file->getClientOriginalName());
+ $sub_save_path = FilesModel::absPath(null);
+ $filename = $sub_save_path . $basename;
+ $data = [];
+ $data['name'] = $file->getClientOriginalName();
+ $data['size'] = $file->getSize();
+ $data['type'] = $file->getClientMimeType();
+ $data['index'] = $basename;
+ $uploaded = FilesModel::saveTo($file, $filename);
+ if(!$uploaded){
+ continue;
}
- else if ($_FILES[$field]['type'] == 'image/gif')
- {
- $src_image = imagecreatefromgif($filename);
- $dst_image = imagecreatetruecolor($thumbnails_width, $thumbnails_height);
- imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $thumbnails_width, $thumbnails_height, $width, $height);
- imagegif($dst_image, $thumbnails_filename);
+ $thumbmail_index = FilesModel::makeThumbIndex($filename,$basename,$thumbnail_size );
+ if($thumbmail_index){
+ $data['thumbnails_index'] = $thumbmail_index;
}
- else
- {
- @copy($filename, $thumbnails_filename);
+
+ $data['ext'] = $ext;
+ $data['tag'] = 'uploader';
+ $data['project_key'] = $project_key;
+ $data['uploader'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
+ $file = File::create($data);
+ $uploaded_files[] = $file;
+ $issue_id = $request->input('issue_id');
+ if (isset($issue_id) && $issue_id) {
+ Event::dispatch(new FileUploadEvent($project_key, $issue_id, $field, $file->id, $data['uploader']));
}
- $data['thumbnails_index'] = $basename . '_thumbnails';
- // move the thumbnails
- @rename($thumbnails_filename, $sub_save_path . $data['thumbnails_index']);
}
- // move original file
- @rename($filename, $sub_save_path . $basename);
- $data['uploader'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- $file = File::create($data);
- $issue_id = $request->input('issue_id');
- if (isset($issue_id) && $issue_id)
- {
- Event::fire(new FileUploadEvent($project_key, $issue_id, $field, $file->id, $data['uploader']));
+ if (count($uploaded_files) > 1) {
+ $data = [];
+ foreach ($uploaded_files as $file) {
+ $data[] = ['file' => $file, 'filename' => '/actionview/api/project/' . $project_key . '/file/' . $file->id];
+ }
+ return Response()->json(['ecode' => 0, 'data' => $data]);
+ } else {
+ $file = array_pop($uploaded_files);
+ $data = ['field' => $field, 'file' => $file, 'filename' => '/actionview/api/project/' . $project_key . '/file/' . $file->id];
+ return Response()->json(['ecode' => 0, 'data' => $data]);
}
-
- return Response()->json([ 'ecode' => 0, 'data' => [ 'field' => $field, 'file' => File::find($file->id), 'filename' => '/api/project/' . $project_key . '/file/' . $file->id ] ]);
}
/**
@@ -115,15 +107,24 @@ public function upload(Request $request, $project_key)
public function downloadThumbnail(Request $request, $project_key, $id)
{
$file = File::find($id);
- $filepath = config('filesystems.disks.local.root', '/tmp') . '/' . substr($file->index, 0, 2);
- $filename = $filepath . '/' . $file->thumbnails_index;
-
- if (!file_exists($filename))
- {
- throw new \UnexpectedValueException('file does not exist.', -15100);
+ if (!$file) {
+ throw new \UnexpectedValueException('id does not exist.', -15100);
}
+ if (!File::isRemote($file)) {
+ if(FilesModel::defaultDisk()=='local'){
+ $filename = FilesModel::absPath($file->thumbnails_index);
+ if (!file_exists($filename)) {
+ throw new \UnexpectedValueException('file does not exist.', -15100);
+ }
+ FileUtil::download($filename, $file->name);
+ }else{
+ $url = FilesModel::disk()->getUrl($file->index.FilesModel::$TBDOT);
+ return redirect($url);
+ }
- FileUtil::download($filename, $file->name);
+ } else {
+ return redirect($file->remote);
+ }
}
/**
@@ -136,22 +137,34 @@ public function download(Request $request, $project_key, $id)
{
set_time_limit(0);
- $file = File::find($id);
- if (!$file || $file->del_flg == 1)
- {
+ $file = File::find($id);
+ if (!$file || $file->del_flg == 1) {
throw new \UnexpectedValueException('file does not exist.', -15100);
}
- $filepath = config('filesystems.disks.local.root', '/tmp') . '/' . substr($file->index, 0, 2);
- $filename = $filepath . '/' . $file->index;
- if (!file_exists($filename))
- {
- throw new \UnexpectedValueException('file does not exist.', -15100);
- }
+ if (!File::isRemote($file)) {
+ if(FilesModel::defaultDisk()=='local'){
+ $filename = FilesModel::absPath($file->index);
+ if (!file_exists($filename)) {
+ throw new \UnexpectedValueException('file does not exist.', -15100);
+ }
- FileUtil::download($filename, $file->name);
+ if ($file->type == 'application/pdf') {
+ FileUtil::pdfPreview($filename, $file->name);
+ } else {
+ FileUtil::download($filename, $file->name);
+ }
+ }else{
+ $url = FilesModel::disk()->getUrl($file->index);
+ return redirect($url);
+ }
+ } else {
+ return redirect($file->remote);
+ }
}
+
+
/**
* get avatar file.
*
@@ -160,18 +173,21 @@ public function download(Request $request, $project_key, $id)
public function getAvatar(Request $request)
{
$fid = $request->input('fid');
- if (!isset($fid) || !$fid)
- {
+ if (!isset($fid) || !$fid) {
throw new \UnexpectedValueException('the avatar file id cannot empty.', -15100);
}
- $filename = config('filesystems.disks.local.root', '/tmp') . '/avatar/' . $fid;
- if (!file_exists($filename))
- {
- throw new \UnexpectedValueException('the avatar file does not exist.', -15100);
- }
+ $filename = FilesModel::absPath(null) . '/avatar/' . $fid;
+ if(FilesModel::defaultDisk()=='local'){
+ if (!file_exists($filename)) {
+ throw new \UnexpectedValueException('the avatar file does not exist.', -15100);
+ }
- FileUtil::download($filename, $filename);
+ FileUtil::download($filename, 'avatar_' . basename($filename) . '.png');
+ }else{
+ $url = FilesModel::disk()->getUrl($filename);
+ return redirect($url);
+ }
}
/**
@@ -190,32 +206,26 @@ public function delete(Request $request, $project_key, $id)
// throw new \UnexpectedValueException('file does not exist.', -15100);
//}
- if ($file && !$this->isPermissionAllowed($project_key, 'remove_file') && !($this->isPermissionAllowed($project_key, 'remove_self_file') && $file->uploader['id'] == $this->user->id))
- {
+ if ($file && !$this->isPermissionAllowed($project_key, 'remove_file') && !($this->isPermissionAllowed($project_key, 'remove_self_file') && $file->uploader['id'] == $this->user->id)) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
$issue_id = $request->input('issue_id');
$field_key = $request->input('field_key');
- if (isset($issue_id) && $issue_id && isset($field_key) && $field_key)
- {
- $user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new FileDelEvent($project_key, $issue_id, $field_key, $id, $user));
+ if (isset($issue_id) && $issue_id && isset($field_key) && $field_key) {
+ $user = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
+ Event::dispatch(new FileDelEvent($project_key, $issue_id, $field_key, $id, $user));
}
// logically deleted
- if ($file)
- {
- $file->fill([ 'del_flg' => 1 ])->save();
+ if ($file) {
+ $file->fill(['del_flg' => 1])->save();
}
$issue = DB::collection('issue_' . $project_key)->where('_id', $issue_id)->first();
- if (array_search($id, $issue[$field_key]) === false)
- {
+ if (array_search($id, $issue[$field_key]) === false) {
return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
- }
- else
- {
+ } else {
throw new \UnexpectedValueException('file deletion failed.', -15102);
}
}
@@ -230,25 +240,18 @@ public function uploadTmpFile(Request $request)
{
set_time_limit(0);
- if (empty($_FILES) || $_FILES['file']['error'] > 0)
- {
+ if (empty($_FILES) || $_FILES['file']['error'] > 0) {
throw new \UnexpectedValueException('upload file errors.', -15101);
}
- $basename = md5(microtime() . $_FILES['file']['name']);
- $sub_save_path = config('filesystems.disks.local.root', '/tmp') . '/' . substr($basename, 0, 2) . '/';
- if (!is_dir($sub_save_path))
- {
- @mkdir($sub_save_path);
- }
- $filename = '/tmp/' . $basename;
- move_uploaded_file($_FILES['file']['tmp_name'], $filename);
-
+ $basename = FilesModel::basePath($_FILES['file']['name']);
+ $filename = FilesModel::tmpDir() . '/' . $basename;
+ move_uploaded_file($_FILES['file']['tmp_name'], FilesModel::checkParent($filename));
// move original file
- @rename($filename, $sub_save_path . $basename);
- $data['uploader'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ @rename($filename, FilesModel::checkParent(FilesModel::absPath($basename)));
+ $data['uploader'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$file = File::create($data);
- return Response()->json([ 'ecode' => 0, 'data' => [ 'fid' => $basename, 'fname' => $_FILES['file']['name'] ] ]);
+ return Response()->json(['ecode' => 0, 'data' => ['fid' => $basename, 'fname' => $_FILES['file']['name']]]);
}
}
diff --git a/app/Http/Controllers/GroupController.php b/app/Http/Controllers/GroupController.php
old mode 100644
new mode 100755
index 98d07a31a..d22c387a9
--- a/app/Http/Controllers/GroupController.php
+++ b/app/Http/Controllers/GroupController.php
@@ -12,13 +12,14 @@
use App\ActiveDirectory\Eloquent\Directory;
+use Sentinel;
use Cartalyst\Sentinel\Users\EloquentUser;
class GroupController extends Controller
{
public function __construct()
{
- $this->middleware('privilege:sys_admin', [ 'except' => [ 'search' ] ]);
+ $this->middleware('privilege:sys_admin', [ 'only' => [ 'index', 'delMultiGroups' ] ]);
parent::__construct();
}
@@ -34,12 +35,74 @@ public function search(Request $request)
if ($s)
{
$groups = Group::Where('name', 'like', '%' . $s . '%')
+ ->where(function ($query) {
+ $query->where('principal.id', $this->user->id)
+ ->orWhere(function ($query) {
+ $query->where('public_scope', '3')->where('users', $this->user->id);
+ })
+ ->orWhere(function ($query) {
+ $query->where('public_scope', '<>', '2')->where('public_scope', '<>', '3');
+ });
+ })
->get([ 'name' ]);
}
+
return Response()->json([ 'ecode' => 0, 'data' => $groups ]);
}
+ /**
+ * Display a listing of the resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function mygroup(Request $request)
+ {
+ $query = Group::where('name', '<>', '');
+
+ if ($name = $request->input('name'))
+ {
+ $query->where('name', 'like', '%' . $name . '%');
+ }
+
+ if ($scale = $request->input('scale'))
+ {
+ if ($scale == 'myprincipal')
+ {
+ $query->where('principal.id', $this->user->id);
+ }
+ else if ($scale == 'myjoin')
+ {
+ $query->where('users', $this->user->id);
+ }
+ }
+
+ $query->where(function ($query) {
+ $query->where('principal.id', $this->user->id)
+ ->orWhere(function ($query) {
+ $query->where('public_scope', '<>', '2')->where('users', $this->user->id);
+ });
+ //->orWhere(function ($query) {
+ // $query->where('public_scope', '<>', '2')->where('public_scope', '<>', '3');
+ //});
+ });
+
+ // get total
+ $total = $query->count();
+
+ $page_size = 30;
+ $page = $request->input('page') ?: 1;
+ $query = $query->skip($page_size * ($page - 1))->take($page_size);
+ $groups = $query->get();
+
+ foreach ($groups as $group)
+ {
+ $group->users = EloquentUser::find($group->users ?: []);
+ }
+
+ return Response()->json([ 'ecode' => 0, 'data' => $groups, 'options' => [ 'total' => $total, 'sizePerPage' => $page_size ] ]);
+ }
+
/**
* Display a listing of the resource.
*
@@ -59,13 +122,26 @@ public function index(Request $request)
$query->where('directory', $directory);
}
+ // public_scope 范围
+ if ($public_scope = $request->input('public_scope'))
+ {
+ if ($public_scope == '1')
+ {
+ $query->where('public_scope', '<>', '2')->where('public_scope', '<>', '3');
+ }
+ else if ($public_scope == '2' || $public_scope == '3')
+ {
+ $query->where('public_scope', $public_scope);
+ }
+ }
+
// get total
$total = $query->count();
$page_size = 30;
$page = $request->input('page') ?: 1;
$query = $query->skip($page_size * ($page - 1))->take($page_size);
- $groups = $query->get([ 'name', 'users', 'directory' ]);
+ $groups = $query->get();
foreach ($groups as $group)
{
@@ -83,13 +159,54 @@ public function index(Request $request)
*/
public function store(Request $request)
{
+ $insValues = [];
+
$name = $request->input('name');
if (!$name)
{
throw new \UnexpectedValueException('the name can not be empty.', -10200);
}
+ $insValues['name'] = $name;
+
+ $principal = $request->input('principal');
+ if (isset($principal) && $principal)
+ {
+ if ($principal == 'self')
+ {
+ $insValues['principal'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ }
+ else
+ {
+ $principal_info = Sentinel::findById($principal);
+ if (!$principal_info)
+ {
+ throw new \InvalidArgumentException('the user is not exists.', -10205);
+ }
+ $insValues['principal'] = [ 'id' => $principal_info->id, 'name' => $principal_info->first_name, 'email' => $principal_info->email ];
+ }
+ }
- $group = Group::create($request->all());
+ $public_scope = $request->input('public_scope');
+ if ($public_scope)
+ {
+ if (!in_array($public_scope, ['1', '2', '3']))
+ {
+ throw new \UnexpectedValueException('the public scope value has error.', -10204);
+ }
+ $insValues['public_scope'] = $public_scope;
+ }
+ else
+ {
+ $insValues['public_scope'] = '1';
+ }
+
+ $description = $request->input('description');
+ if (isset($description))
+ {
+ $insValues['description'] = $description;
+ }
+
+ $group = Group::create($insValues);
return Response()->json([ 'ecode' => 0, 'data' => $group ]);
}
@@ -120,6 +237,22 @@ public function show($id)
*/
public function update(Request $request, $id)
{
+ $group = Group::find($id);
+ if (!$group)
+ {
+ throw new \UnexpectedValueException('the group does not exist.', -10201);
+ }
+
+ if (isset($group->diectory) && $group->directory && $group->diectory != 'self')
+ {
+ throw new \UnexpectedValueException('the group come from external directroy.', -10203);
+ }
+
+ if (!(isset($group->principal) && isset($group->principal['id']) && $group->principal['id'] == $this->user->id) && !$this->user->hasAccess('sys_admin'))
+ {
+ return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
+ }
+
$updValues = [];
$name = $request->input('name');
if (isset($name))
@@ -131,20 +264,44 @@ public function update(Request $request, $id)
$updValues['name'] = $name;
}
+ $principal = $request->input('principal');
+ if (isset($principal))
+ {
+ if ($principal)
+ {
+ $principal_info = Sentinel::findById($principal);
+ if (!$principal_info)
+ {
+ throw new \InvalidArgumentException('the user is not exists.', -10205);
+ }
+ $updValues['principal'] = [ 'id' => $principal_info->id, 'name' => $principal_info->first_name, 'email' => $principal_info->email ];
+ }
+ else
+ {
+ $updValues['principal'] = '';
+ }
+ }
+
$user_ids = $request->input('users');
if (isset($user_ids))
{
$updValues['users'] = $user_ids ?: [];
}
- $group = Group::find($id);
- if (!$group)
+ $public_scope = $request->input('public_scope');
+ if (isset($public_scope))
{
- throw new \UnexpectedValueException('the group does not exist.', -10201);
+ if (!in_array($public_scope, ['1', '2', '3']))
+ {
+ throw new \UnexpectedValueException('the public scope value has error.', -10204);
+ }
+ $updValues['public_scope'] = $public_scope;
}
- if (isset($group->diectory) && $group->directory && $group->diectory != 'self')
+
+ $description = $request->input('description');
+ if (isset($description))
{
- throw new \UnexpectedValueException('the group come from external directroy.', -10203);
+ $updValues['description'] = $description;
}
$group->fill($updValues)->save();
@@ -165,13 +322,19 @@ public function destroy($id)
{
throw new \UnexpectedValueException('the group does not exist.', -10201);
}
+
if (isset($group->diectory) && $group->directory && $group->diectory != 'self')
{
throw new \UnexpectedValueException('the group come from external directroy.', -10203);
}
+ if (!(isset($group->principal) && isset($group->principal['id']) && $group->principal['id'] == $this->user->id) && !$this->user->hasAccess('sys_admin'))
+ {
+ return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
+ }
+
Group::destroy($id);
- Event::fire(new DelGroupEvent($id));
+ Event::dispatch(new DelGroupEvent($id));
return Response()->json([ 'ecode' => 0, 'data' => [ 'id' => $id ] ]);
}
@@ -199,7 +362,7 @@ public function delMultiGroups(Request $request)
continue;
}
$group->delete();
- Event::fire(new DelGroupEvent($id));
+ Event::dispatch(new DelGroupEvent($id));
$deleted_ids[] = $id;
}
}
diff --git a/app/Http/Controllers/IssueController.php b/app/Http/Controllers/IssueController.php
old mode 100644
new mode 100755
index 234f89edf..bf83fe07e
--- a/app/Http/Controllers/IssueController.php
+++ b/app/Http/Controllers/IssueController.php
@@ -11,6 +11,7 @@
use App\Project\Provider;
use App\Project\Eloquent\File;
use App\Project\Eloquent\Watch;
+use App\Project\Eloquent\IssueFilters;
use App\Project\Eloquent\UserIssueFilters;
use App\Project\Eloquent\UserIssueListColumns;
use App\Project\Eloquent\ProjectIssueListColumns;
@@ -120,6 +121,7 @@ public function index(Request $request, $project_key)
$query = $query->skip($page_size * ($page - 1))->take($page_size);
$issues = $query->get();
+
if (isset($from) && $from == 'export')
{
$export_fields = $request->input('export_fields');
@@ -139,13 +141,15 @@ public function index(Request $request, $project_key)
$cache_parents = [];
$issue_ids = [];
+ $issues_new = [];
+
foreach ($issues as $key => $issue)
{
$issue_ids[] = $issue['_id']->__toString();
// set issue watching flag
if (in_array($issue['_id']->__toString(), $watched_issue_ids))
{
- $issues[$key]['watching'] = true;
+ $issue['watching'] = true;
}
// get the parent issue
@@ -153,22 +157,25 @@ public function index(Request $request, $project_key)
{
if (isset($cache_parents[$issue['parent_id']]) && $cache_parents[$issue['parent_id']])
{
- $issues[$key]['parent'] = $cache_parents[$issue['parent_id']];
+ $issue['parent'] = $cache_parents[$issue['parent_id']];
}
else
{
$parent = DB::collection('issue_' . $project_key)->where('_id', $issue['parent_id'])->first();
- $issues[$key]['parent'] = $parent ? array_only($parent, [ '_id', 'title', 'no', 'type', 'state' ]) : [];
- $cache_parents[$issue['parent_id']] = $issues[$key]['parent'];
+ $issue['parent'] =$parent ? array_only($parent, [ '_id', 'title', 'no', 'type', 'state' ]) : [];
+ $cache_parents[$issue['parent_id']] = $issue['parent'];
}
}
if (!isset($from))
{
- $issues[$key]['hasSubtasks'] = DB::collection('issue_' . $project_key)->where('parent_id', $issue['_id']->__toString())->exists();
+ $issue['hasSubtasks'] = DB::collection('issue_' . $project_key)->where('parent_id', $issue['_id']->__toString())->exists();
}
+ $issues_new[$key] =$issue;
}
+ $issues = $issues_new;
+
if ($issues && isset($from) && in_array($from, [ 'kanban', 'active_sprint', 'backlog', 'his_sprint' ]))
{
$filter = $request->input('filter') ?: '';
@@ -205,6 +212,12 @@ public function index(Request $request, $project_key)
$options['today'] = date('Y/m/d');
}
+ $requested_at = $request->input('requested_at');
+ if (isset($requested_at) && $requested_at)
+ {
+ $options['requested_at'] = intval($requested_at);
+ }
+
return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($issues), 'options' => $options ]);
}
@@ -258,7 +271,7 @@ public function search(Request $request, $project_key)
$limit = 10;
}
- $query->take($limit)->orderBy('created_at', 'asc');
+ $query->take($limit)->orderBy('created_at', 'desc');
$issues = $query->get();
return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($issues) ]);
}
@@ -282,7 +295,11 @@ public function store(Request $request, $project_key)
{
throw new \UnexpectedValueException('the schema of the type is not existed.', -11101);
}
- $valid_keys = array_merge(array_column($schema, 'key'), [ 'type', 'parent_id' ]);
+
+ if (!$this->requiredCheck($schema, $request->all(), 'create'))
+ {
+ throw new \UnexpectedValueException('the required field is empty.', -11121);
+ }
// handle timetracking
$insValues = [];
@@ -301,10 +318,15 @@ public function store(Request $request, $project_key)
throw new \UnexpectedValueException('the format of timetracking is incorrect.', -11102);
}
$insValues[$field['key']] = $this->ttHandle($fieldValue);
-
- $valid_keys[] = $field['key'] . '_m';
$insValues[$field['key'] . '_m'] = $this->ttHandleInM($insValues[$field['key']]);
}
+ else if ($field['type'] == 'DatePicker' || $field['type'] == 'DateTimePicker')
+ {
+ if ($this->isTimestamp($fieldValue) === false)
+ {
+ throw new \UnexpectedValueException('the format of datepicker field is incorrect.', -11122);
+ }
+ }
else if ($field['type'] == 'SingleUser')
{
$user_info = Sentinel::findById($fieldValue);
@@ -327,8 +349,6 @@ public function store(Request $request, $project_key)
$new_user_ids[] = $uid;
}
}
-
- $valid_keys[] = $field['key'] . '_ids';
$insValues[$field['key'] . '_ids'] = $new_user_ids;
}
}
@@ -388,16 +408,17 @@ public function store(Request $request, $project_key)
// get reporter(creator)
$insValues['reporter'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- $insValues['created_at'] = time();
+ $insValues['updated_at'] = $insValues['created_at'] = time();
$table = 'issue_' . $project_key;
- $max_no = DB::collection($table)->count() + 1;
- $insValues['no'] = $max_no;
+ $max_row = DB::collection($table)->orderBy('no', 'desc')->first();
+ $insValues['no'] = $max_row?intval($max_row['no'])+1:1;
// workflow initialize
$workflow = $this->initializeWorkflow($issue_type);
$insValues = $insValues + $workflow;
+ $valid_keys = $this->getValidKeysBySchema($schema);
// merge all fields
$insValues = $insValues + array_only($request->all(), $valid_keys);
@@ -407,7 +428,7 @@ public function store(Request $request, $project_key)
// add to histroy table
Provider::snap2His($project_key, $id, $schema);
// trigger event of issue created
- Event::fire(new IssueEvent($project_key, $id->__toString(), $insValues['reporter'], [ 'event_key' => 'create_issue' ]));
+ Event::dispatch(new IssueEvent($project_key, $id->__toString(), $insValues['reporter'], [ 'event_key' => 'create_issue' ]));
// create the Labels for project
if (isset($insValues['labels']) && $insValues['labels'])
@@ -459,7 +480,7 @@ public function show($project_key, $id)
if (isset($issue['assignee']['id']))
{
- $user = Sentinel::findById($issue['assignee']['id']);
+ $user = Sentinel::findById(id_mix($issue['assignee']['id']));
$issue['assignee']['avatar'] = isset($user->avatar) ? $user->avatar : '';
}
@@ -560,6 +581,15 @@ public function show($project_key, $id)
->where('issue_id', $id)
->count();
+ //Tedx 优化描述输出 START
+
+ if(config('setting.imgurl')){
+ if(isset($issue['descriptions']) && $issue['descriptions']){
+ $issue['descriptions'] = str_replace("{IMGURL}",config('setting.imgurl'), $issue['descriptions']);
+ }
+ }
+ //Tedx 优化描述输出 END
+
return Response()->json(['ecode' => 0, 'data' => parent::arrange($issue)]);
}
@@ -616,11 +646,11 @@ public function getOptions($project_key)
// get project types
$types = Provider::getTypeListExt($project_key, [ 'user' => $users, 'assignee' => $assignees, 'state' => $states, 'resolution' => $resolutions, 'priority' => $priorities, 'version' => $versions, 'module' => $modules, 'epic' => $epics, 'labels' => $labels ]);
// get project sprints
- $sprint_nos = [];
+ $new_sprints = [];
$sprints = Provider::getSprintList($project_key);
foreach ($sprints as $sprint)
{
- $sprint_nos[] = strval($sprint['no']);
+ $new_sprints[] = [ 'no' => $sprint['no'], 'name' => $sprint['name'] ];
}
// get defined fields
$fields = Provider::getFieldList($project_key);
@@ -646,7 +676,7 @@ public function getOptions($project_key)
'labels' => $labels,
'versions' => $versions,
'epics' => $epics,
- 'sprints' => $sprint_nos,
+ 'sprints' => $new_sprints,
'filters' => $filters,
'display_columns' => $display_columns,
'timetrack' => $timetrack,
@@ -723,7 +753,7 @@ public function setAssignee(Request $request, $project_key, $id)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $id, null, [ 'assignee' ]);
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'assign_issue', 'data' => [ 'old_user' => $issue['assignee'], 'new_user' => $assignee ] ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'assign_issue', 'data' => [ 'old_user' => $issue['assignee'], 'new_user' => $assignee ] ]));
return $this->show($project_key, $id);
}
@@ -738,10 +768,7 @@ public function setAssignee(Request $request, $project_key, $id)
*/
public function setLabels(Request $request, $project_key, $id)
{
- if (!$this->isPermissionAllowed($project_key, 'edit_issue'))
- {
- return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
- }
+
$labels = $request->input('labels');
if (!isset($labels))
@@ -755,7 +782,10 @@ public function setLabels(Request $request, $project_key, $id)
{
throw new \UnexpectedValueException('the issue does not exist or is not in the project.', -11103);
}
-
+ if (!$this->isPermissionAllowed($project_key, 'edit_issue') && !($this->isPermissionAllowed($project_key, 'edit_self_issue') && $issue['reporter']['id'] == $this->user->id))
+ {
+ return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
+ }
$updValues['labels'] = $labels;
$updValues['modifier'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
@@ -765,7 +795,7 @@ public function setLabels(Request $request, $project_key, $id)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $id, null, [ 'labels' ]);
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
// create the Labels for project
if ($labels)
{
@@ -801,6 +831,82 @@ public function createLabels($project_key, $labels)
return true;
}
+ /**
+ * check the required field
+ *
+ * @param array $schema
+ * @param array $data
+ * @param string $mode
+ * @return bool
+ */
+ public function requiredCheck($schema, $data, $mode='create')
+ {
+ foreach ($schema as $field)
+ {
+ if (isset($field['required']) && $field['required'])
+ {
+ if ($mode == 'update')
+ {
+ if (isset($data[$field['key']]) && !$data[$field['key']] && $data[$field['key']] !== 0)
+ {
+ return false;
+ }
+ }
+ else
+ {
+ if (!isset($data[$field['key']]) || !$data[$field['key']] && $data[$field['key']] !== 0)
+ {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * check if the unix stamp
+ *
+ * @param int $timestamp
+ * @return bool
+ */
+ public function isTimestamp($timestamp)
+ {
+ if(strtotime(date('Y-m-d H:i:s', $timestamp)) === $timestamp)
+ {
+ return $timestamp;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * get valid keys by schema
+ *
+ * @param array $schema
+ * @return array
+ */
+ public function getValidKeysBySchema($schema=[])
+ {
+ $valid_keys = array_merge(array_column($schema, 'key'), [ 'type', 'assignee', 'descriptions', 'labels', 'parent_id', 'resolution', 'priority', 'progress', 'expect_start_time', 'expect_compete_time' ,'updated_at']); //Tedx增加更新时间
+
+ foreach ($schema as $field)
+ {
+ if ($field['type'] == 'MultiUser')
+ {
+ $valid_keys[] = $field['key'] . '_ids';
+ }
+ else if ($field['type'] == 'TimeTracking')
+ {
+ $valid_keys[] = $field['key'] . '_m';
+ }
+ }
+
+ return $valid_keys;
+ }
+
/**
* Update the specified resource in storage.
*
@@ -811,11 +917,7 @@ public function createLabels($project_key, $labels)
*/
public function update(Request $request, $project_key, $id)
{
- if (!$this->isPermissionAllowed($project_key, 'edit_issue') && !$this->isPermissionAllowed($project_key, 'exec_workflow'))
- {
- return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
- }
-
+
if (!$request->all())
{
return $this->show($project_key, $id);
@@ -828,12 +930,22 @@ public function update(Request $request, $project_key, $id)
throw new \UnexpectedValueException('the issue does not exist or is not in the project.', -11103);
}
+ if (!$this->isPermissionAllowed($project_key, 'edit_issue') && !($this->isPermissionAllowed($project_key, 'edit_self_issue') && $issue['reporter']['id'] == $this->user->id) && !$this->isPermissionAllowed($project_key, 'exec_workflow'))
+ {
+ return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
+ }
+
+
$schema = Provider::getSchemaByType($request->input('type') ?: $issue['type']);
if (!$schema)
{
throw new \UnexpectedValueException('the schema of the type is not existed.', -11101);
}
- $valid_keys = array_merge(array_column($schema, 'key'), [ 'type', 'assignee', 'labels', 'parent_id', 'resolution', 'priority', 'progress', 'expect_start_time', 'expect_compete_time' ]);
+
+ if (!$this->requiredCheck($schema, $request->all(), 'update'))
+ {
+ throw new \UnexpectedValueException('the required field is empty.', -11121);
+ }
// handle timetracking
$updValues = [];
@@ -849,13 +961,19 @@ public function update(Request $request, $project_key, $id)
{
if (!$this->ttCheck($fieldValue))
{
- throw new \UnexpectedValueException('the format of timetracking is incorrect.', -11102);
+ throw new \UnexpectedValueException('the format of timetracking field is incorrect.', -11102);
}
- $updValues[$field['key']] = $this->ttHandle($fieldValue);
- $valid_keys[] = $field['key'] . '_m';
+ $updValues[$field['key']] = $this->ttHandle($fieldValue);
$updValues[$field['key'] . '_m'] = $this->ttHandleInM($updValues[$field['key']]);
}
+ else if ($field['type'] == 'DatePicker' || $field['type'] == 'DateTimePicker')
+ {
+ if ($this->isTimestamp($fieldValue) === false)
+ {
+ throw new \UnexpectedValueException('the format of datepicker field is incorrect.', -11122);
+ }
+ }
else if ($field['type'] == 'SingleUser')
{
$user_info = Sentinel::findById($fieldValue);
@@ -878,8 +996,6 @@ public function update(Request $request, $project_key, $id)
}
$new_user_ids[] = $uid;
}
-
- $valid_keys[] = $field['key'] . '_ids';
$updValues[$field['key'] . '_ids'] = $new_user_ids;
}
}
@@ -900,6 +1016,7 @@ public function update(Request $request, $project_key, $id)
}
}
+ $valid_keys = $this->getValidKeysBySchema($schema);
$updValues = $updValues + array_only($request->all(), $valid_keys);
if (!$updValues)
{
@@ -914,7 +1031,7 @@ public function update(Request $request, $project_key, $id)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $id, $schema, array_keys(array_only($request->all(), $valid_keys)));
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
// create the Labels for project
if (isset($updValues['labels']) && $updValues['labels'])
{
@@ -934,31 +1051,48 @@ public function update(Request $request, $project_key, $id)
public function destroy($project_key, $id)
{
$table = 'issue_' . $project_key;
- $issue = DB::collection($table)->find($id);
+ $issue = DB::collection($table)
+ ->where('_id', $id)
+ ->where('del_flg', '<>', 1)
+ ->first();
if (!$issue)
{
throw new \UnexpectedValueException('the issue does not exist or is not in the project.', -11103);
}
+ if (!$this->isPermissionAllowed($project_key, 'delete_issue') && !($this->isPermissionAllowed($project_key, 'delete_self_issue') && $issue['reporter']['id'] == $this->user->id))
+ {
+ return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
+ }
+
$user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
$ids = [ $id ];
// delete all subtasks of this issue
- $subtasks = DB::collection('issue_' . $project_key)->where('parent_id', $id)->get();
+ $subtasks = DB::collection('issue_' . $project_key)
+ ->where('parent_id', $id)
+ ->where('del_flg', '<>', 1)
+ ->get();
foreach ($subtasks as $subtask)
{
$sub_id = $subtask['_id']->__toString();
DB::collection($table)->where('_id', $sub_id)->update([ 'del_flg' => 1 ]);
- Event::fire(new IssueEvent($project_key, $sub_id, $user, [ 'event_key' => 'del_issue' ]));
+ // delete linked relation
+ DB::collection('linked')->where('src', $sub_id)->orWhere('dest', $sub_id)->delete();
+
+ Event::dispatch(new IssueEvent($project_key, $sub_id, $user, [ 'event_key' => 'del_issue' ]));
$ids[] = $sub_id;
}
+
// delete linked relation
DB::collection('linked')->where('src', $id)->orWhere('dest', $id)->delete();
+ // delete watch
+ Watch::where('issue_id', $id)->delete();
// delete this issue
DB::collection($table)->where('_id', $id)->update([ 'del_flg' => 1 ]);
// trigger event of issue deleted
- Event::fire(new IssueEvent($project_key, $id, $user, [ 'event_key' => 'del_issue' ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $user, [ 'event_key' => 'del_issue' ]));
return Response()->json(['ecode' => 0, 'data' => [ 'ids' => $ids ]]);
}
@@ -988,43 +1122,18 @@ public function saveIssueFilter(Request $request, $project_key)
throw new \UnexpectedValueException('the name can not be empty.', -11105);
}
- if (UserIssueFilters::whereRaw([ 'name' => $name, 'user' => $this->user->id, 'project_key' => $project_key ])->exists())
+ $query = $request->input('query') ?: [];
+
+ $scope = 'private';
+ if ($this->isPermissionAllowed($project_key, 'manage_project'))
{
- throw new \UnexpectedValueException('filter name cannot be repeated', -11106);
+ $scope = $request->input('scope') ?: 'private';
}
+
+ $creator = $this->user->id;
- $query = $request->input('query') ?: [];
+ IssueFilters::create([ 'project_key' => $project_key, 'name' => $name, 'query' => $query, 'scope' => $scope, 'creator' => $creator ]);
- $res = UserIssueFilters::where('project_key', $project_key)
- ->where('user', $this->user->id)
- ->first();
- if ($res)
- {
- $filters = isset($res['filters']) ? $res['filters'] : [];
- foreach($filters as $filter)
- {
- if (isset($filter['name']) && $filter['name'] === $name)
- {
- throw new \UnexpectedValueException('filter name cannot be repeated', -11106);
- }
- }
- array_push($filters, [ 'id' => md5(microtime()), 'name' => $name, 'query' => $query ]);
- $res->filters = $filters;
- $res->save();
- }
- else
- {
- $filters = Provider::getDefaultIssueFilters();
- foreach($filters as $filter)
- {
- if (isset($filter['name']) && $filter['name'] === $name)
- {
- throw new \UnexpectedValueException('filter name cannot be repeated', -11106);
- }
- }
- array_push($filters, [ 'id' => md5(microtime()), 'name' => $name, 'query' => $query ]);
- UserIssueFilters::create([ 'project_key' => $project_key, 'user' => $this->user->id, 'filters' => $filters ]);
- }
return $this->getIssueFilters($project_key);
}
@@ -1135,47 +1244,47 @@ public function setDisplayColumns(Request $request, $project_key)
}
/**
- * edit the mode filters.
+ * edit or delete the batch filters.
*
* @param string $project_key
* @return \Illuminate\Http\Response
*/
- public function editFilters(Request $request, $project_key)
+ public function batchHandleFilters(Request $request, $project_key)
{
- $sequence = $request->input('sequence');
- if (isset($sequence))
+ $mode = $request->input('mode');
+ if ($mode === 'sort')
{
- $old_filters = Provider::getDefaultIssueFilters();
+ $sequence = $request->input('sequence');
+ if (!isset($sequence) || !$sequence)
+ {
+ return $this->getIssueFilters($project_key);
+ }
+
$res = UserIssueFilters::where('project_key', $project_key)
->where('user', $this->user->id)
->first();
if ($res)
{
- $old_filters = isset($res->filters) ? $res->filters : [];
- }
-
- $new_filters = [];
- foreach ($sequence as $id)
- {
- foreach ($old_filters as $filter)
- {
- if ($filter['id'] === $id)
- {
- $new_filters[] = $filter;
- break;
- }
- }
- }
- if ($res)
- {
- $res->filters = $new_filters;
+ $res->sequence = $sequence;
$res->save();
}
else
{
- UserIssueFilters::create([ 'project_key' => $project_key, 'user' => $this->user->id, 'filters' => $new_filters ]);
+ UserIssueFilters::create([ 'project_key' => $project_key, 'user' => $this->user->id, 'sequence' => $sequence ]);
+ }
+ }
+ else if ($mode === 'del')
+ {
+ $ids = $request->input('ids');
+ if (isset($ids) && $ids)
+ {
+ IssueFilters::where('project_key', $project_key)
+ ->where('creator', $this->user->id)
+ ->whereIn('_id', $ids)
+ ->delete();
}
}
+
return $this->getIssueFilters($project_key);
}
@@ -1350,13 +1459,13 @@ public function watch(Request $request, $project_key, $id)
{
Watch::create([ 'project_key' => $project_key, 'issue_id' => $id, 'user' => $cur_user ]);
// trigger event of issue watched
- Event::fire(new IssueEvent($project_key, $id, $cur_user, [ 'event_key' => 'watched_issue' ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $cur_user, [ 'event_key' => 'watched_issue' ]));
}
else
{
$flag = false;
// trigger event of issue watched
- Event::fire(new IssueEvent($project_key, $id, $cur_user, [ 'event_key' => 'unwatched_issue' ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $cur_user, [ 'event_key' => 'unwatched_issue' ]));
}
return Response()->json(['ecode' => 0, 'data' => ['id' => $id, 'user' => $cur_user, 'watching' => $flag]]);
@@ -1421,7 +1530,7 @@ public function resetState(Request $request, $project_key, $id)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $id, null, array_keys($updValues));
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'reset_issue', 'snap_id' => $snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'reset_issue', 'snap_id' => $snap_id ]));
return $this->show($project_key, $id);
}
@@ -1459,7 +1568,7 @@ public function copy(Request $request, $project_key)
throw new \UnexpectedValueException('the schema of the type is not existed.', -11101);
}
- $valid_keys = array_merge(array_column($schema, 'key'), [ 'type', 'parent_id', 'priority', 'resolution', 'assignee' ]);
+ $valid_keys = $this->getValidKeysBySchema($schema);
$insValues = array_only($src_issue, $valid_keys);
$insValues['title'] = $title;
@@ -1496,8 +1605,8 @@ public function copy(Request $request, $project_key)
}
$table = 'issue_' . $project_key;
- $max_no = DB::collection($table)->count() + 1;
- $insValues['no'] = $max_no;
+ $max_row = DB::collection($table)->orderBy('no', 'desc')->first();
+ $insValues['no'] = $max_row?intval($max_row['no'])+1:1;
// workflow initialize
$workflow = $this->initializeWorkflow($src_issue['type']);
@@ -1513,9 +1622,9 @@ public function copy(Request $request, $project_key)
// create link of clone
Linked::create([ 'src' => $src_id, 'relation' => 'is cloned by', 'dest' => $id->__toString(), 'creator' => $insValues['reporter'] ]);
// trigger event of issue created
- Event::fire(new IssueEvent($project_key, $id->__toString(), $insValues['reporter'], [ 'event_key' => 'create_issue' ]));
+ Event::dispatch(new IssueEvent($project_key, $id->__toString(), $insValues['reporter'], [ 'event_key' => 'create_issue' ]));
// trigger event of link created
- Event::fire(new IssueEvent($project_key, $src_id, $insValues['reporter'], [ 'event_key' => 'create_link', 'data' => [ 'relation' => 'is cloned by', 'dest' => $id->__toString() ] ]));
+ Event::dispatch(new IssueEvent($project_key, $src_id, $insValues['reporter'], [ 'event_key' => 'create_link', 'data' => [ 'relation' => 'is cloned by', 'dest' => $id->__toString() ] ]));
return $this->show($project_key, $id->__toString());
}
@@ -1575,7 +1684,7 @@ public function convert(Request $request, $project_key, $id)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $id, null, [ 'parent_id', 'type' ]);
// trigger event of issue moved
- Event::fire(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ] ));
+ Event::dispatch(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ] ));
return $this->show($project_key, $id);
@@ -1623,7 +1732,7 @@ public function move(Request $request, $project_key, $id)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $id, null, [ 'parent_id' ]);
// trigger event of issue moved
- Event::fire(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'move_issue', 'data' => [ 'old_parent' => $issue['parent_id'], 'new_parent' => $parent_id ] ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'move_issue', 'data' => [ 'old_parent' => $issue['parent_id'], 'new_parent' => $parent_id ] ]));
return $this->show($project_key, $id);
}
@@ -1635,7 +1744,8 @@ public function move(Request $request, $project_key, $id)
* @param string $project_key
* @return \Illuminate\Http\Response
*/
- public function release(Request $request, $project_key) {
+ public function release(Request $request, $project_key)
+ {
$ids = $request->input('ids');
if (!$ids)
{
@@ -1665,11 +1775,11 @@ public function release(Request $request, $project_key) {
// add to histroy table
$snap_id = Provider::snap2His($project_key, $id, null, [ 'resolve_version' ]);
// trigger event of issue moved
- Event::fire(new IssueEvent($project_key, $id, $user, [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ] ));
+ Event::dispatch(new IssueEvent($project_key, $id, $user, [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ] ));
}
$isSendMsg = $request->input('isSendMsg') && true;
- Event::fire(new VersionEvent($project_key, $user, [ 'event_key' => 'create_release_version', 'isSendMsg' => $isSendMsg, 'data' => [ 'released_issues' => $ids, 'release_version' => $version->toArray() ] ]));
+ Event::dispatch(new VersionEvent($project_key, $user, [ 'event_key' => 'create_release_version', 'isSendMsg' => $isSendMsg, 'data' => [ 'released_issues' => $ids, 'release_version' => $version->toArray() ] ]));
return Response()->json([ 'ecode' => 0, 'data' => [ 'ids' => $ids ] ]);
}
@@ -2026,19 +2136,26 @@ public function getOptionsForExport($project_key)
}
$modules = [];
- $module_list = Provider::getModuleList($project_key);
+ $module_list = Provider::getModuleList($project_key);
foreach ($module_list as $module)
{
$modules[$module->id] = $module->name;
}
$epics = [];
- $epic_list = Provider::getEpicList($project_key);
+ $epic_list = Provider::getEpicList($project_key);
foreach ($epic_list as $epic)
{
$epics[$epic['_id']] = $epic['name'];
}
+ $sprints = [];
+ $sprint_list = Provider::getSprintList($project_key);
+ foreach ($sprint_list as $sprint)
+ {
+ $sprints[$sprint['no']] = $sprint['name'];
+ }
+
$fields = [];
$field_list = Provider::getFieldList($project_key);
foreach ($field_list as $field)
@@ -2073,6 +2190,7 @@ public function getOptionsForExport($project_key)
'versions' => $versions,
'modules' => $modules,
'epics' => $epics,
+ 'sprints' => $sprints,
'fields' => $fields,
];
@@ -2118,6 +2236,7 @@ public function imports(Request $request, $project_key)
$new_fields = [];
$fields = Provider::getFieldList($project_key);
+
foreach($fields as $field)
{
if ($field->type !== 'File')
@@ -2141,6 +2260,8 @@ public function imports(Request $request, $project_key)
$data = $this->arrangeExcel($data, $fields);
foreach ($data as $val)
{
+ $star = substr("abcdef", 0, -1);
+
if (!isset($val['title']) && !isset($val['type']))
{
$fatal_err_msgs = $err_msgs = '主题列和类型列没找到。';
@@ -2248,7 +2369,7 @@ public function imports(Request $request, $project_key)
}
else
{
- $issue['parent'] = $value['parent'];
+ if(isset($value['parent'])) $issue['parent'] = $value['parent'];
}
if (isset($value['priority']) && $value['priority'])
@@ -2292,7 +2413,7 @@ public function imports(Request $request, $project_key)
}
}
- $user_relate_fields = [ 'assignee' => '经办人', 'reporter' => '报告者', 'resolver' => '解决者', 'closer' => '关闭时间' ];
+ $user_relate_fields = [ 'assignee' => '负责人', 'reporter' => '报告者', 'resolver' => '解决者', 'closer' => '关闭时间' ];
foreach ($user_relate_fields as $uk => $uv)
{
if (isset($value[$uk]) && $value[$uk])
@@ -2585,7 +2706,23 @@ public function imports(Request $request, $project_key)
foreach ($standard_issues as $issue)
{
- $id = $this->importIssue($project_key, $issue, $types[$issue['type']]['schema'], $types[$issue['type']]['workflow']);
+ //Tedx 通过barcode来防止多次导入
+ $table = 'issue_' . $project_key;
+ $id ='';
+ if(isset($issue['barcode']) && $issue['barcode']){
+ $old = DB::collection($table)->where('barcode','=',intval($issue['barcode']))->whereNull('del_flg')->whereNull('parent_id')->first();
+ if($old){
+ $id = $old['_id']->__toString();
+ }
+ }
+ if(!$id){
+ $id = $this->importIssue($project_key, $issue, $types[$issue['type']]['schema'], $types[$issue['type']]['workflow']);
+ }else{
+ $ids = [$id];
+ $values = $issue;
+ $this->batchUpdate($project_key, $ids, $values);
+ }
+
if (!isset($subtask_issues[$issue['title']]) || !$subtask_issues[$issue['title']])
{
continue;
@@ -2619,6 +2756,10 @@ public function imports(Request $request, $project_key)
}
}
+ public function updateOne($project_key){
+
+ }
+
/**
* import the issue into the project
*
@@ -2637,8 +2778,9 @@ public function importIssue($project_key, $data, $schema, $workflow)
$insValues['resolution'] = 'Unresolved';
}
- $max_no = DB::collection($table)->count() + 1;
- $insValues['no'] = $max_no;
+ $max_row = DB::collection($table)->orderBy('no', 'desc')->first();
+ $insValues['no'] = $max_row?intval($max_row['no'])+1:1;
+
if (!isset($insValues['assignee']) || !$insValues['assignee'])
{
@@ -2655,6 +2797,13 @@ public function importIssue($project_key, $data, $schema, $workflow)
$insValues['created_at'] = time();
}
+ //Tedx 增加更新时间 START
+ if (!isset($insValues['updated_at']) || !$insValues['updated_at'])
+ {
+ $insValues['updated_at'] = time();
+ }
+ //Tedx 增加更新时间 END
+
if (!isset($data['state']) || !$data['state'])
{
$wf = $this->initializeWorkflow($data['type']);
@@ -2672,7 +2821,7 @@ public function importIssue($project_key, $data, $schema, $workflow)
// add to histroy table
Provider::snap2His($project_key, $id, $schema);
// trigger event of issue created
- Event::fire(new IssueEvent($project_key, $id, $insValues['reporter'], [ 'event_key' => 'create_issue' ]));
+ Event::dispatch(new IssueEvent($project_key, $id, $insValues['reporter'], [ 'event_key' => 'create_issue' ]));
if (isset($insValues['labels']) && $insValues['labels'])
{
@@ -2692,7 +2841,7 @@ public function importIssue($project_key, $data, $schema, $workflow)
public function initializeWorkflowForImport($wf_definition, $state)
{
// create and start workflow instacne
- $wf_entry = Workflow::createInstance($wf_definition->id);
+ $wf_entry = Workflow::createInstance($wf_definition->id, $this->user->id);
$wf_contents = $wf_definition->contents ?: [];
$steps = isset($wf_contents['steps']) && $wf_contents['steps'] ? $wf_contents['steps'] : [];
@@ -2813,7 +2962,15 @@ public function export($project_key, $export_fields, $issues)
}
else if ($fk == 'sprints')
{
- $tmp[] = 'Sprint ' . implode(',', $issue[$fk]);
+ $new_sprints = [];
+ foreach ($issue[$fk] as $sn)
+ {
+ if (isset($sprints[$sn]))
+ {
+ $new_sprints[] = $sprints[$sn];
+ }
+ }
+ $tmp[] = implode(',', $new_sprints);
}
else if ($fk == 'labels')
{
@@ -2920,4 +3077,260 @@ public function export($project_key, $export_fields, $issues)
});
})->download('xls');
}
+
+ /**
+ * batch handle the issue
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param string $project_key
+ * @return \Illuminate\Http\Response
+ */
+ public function batchHandle(Request $request, $project_key)
+ {
+ $method = $request->input('method');
+ if ($method == 'update')
+ {
+ $data = $request->input('data');
+ if (!$data || !isset($data['ids']) || !$data['ids'] || !is_array($data['ids']) || !isset($data['values']) || !$data['values'] || !is_array($data['values']))
+ {
+ throw new \UnexpectedValueException('the batch params has errors.', -11124);
+ }
+ return $this->batchUpdate($project_key, $data['ids'], $data['values']);
+ }
+ else if ($method == 'delete')
+ {
+ $data = $request->input('data');
+ if (!$data || !isset($data['ids']) || !$data['ids'] || !is_array($data['ids']))
+ {
+ throw new \UnexpectedValueException('the batch params has errors.', -11124);
+ }
+ return $this->batchDelete($project_key, $data['ids']);
+ }
+ else
+ {
+ throw new \UnexpectedValueException('the batch method has errors.', -11125);
+ }
+ }
+
+ /**
+ * batch update the issue
+ *
+ * @param string $project_key
+ * @param array $ids
+ * @return \Illuminate\Http\Response
+ */
+ public function batchDelete($project_key, $ids)
+ {
+ if (!$this->isPermissionAllowed($project_key, 'delete_issue'))
+ {
+ return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
+ }
+
+ $user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+
+ $table = 'issue_' . $project_key;
+ foreach ($ids as $id)
+ {
+ $issue = DB::collection($table)
+ ->where('_id', $id)
+ ->where('del_flg', '<>', 1)
+ ->first();
+ if (!$issue)
+ {
+ continue;
+ }
+
+ // delete all subtasks of this issue
+ $subtasks = DB::collection('issue_' . $project_key)
+ ->where('parent_id', $id)
+ ->where('del_flg', '<>', 1)
+ ->get();
+ foreach ($subtasks as $subtask)
+ {
+ $sub_id = $subtask['_id']->__toString();
+ DB::collection($table)->where('_id', $sub_id)->update([ 'del_flg' => 1 ]);
+
+ // delete linked relation
+ DB::collection('linked')->where('src', $sub_id)->orWhere('dest', $sub_id)->delete();
+
+ Event::dispatch(new IssueEvent($project_key, $sub_id, $user, [ 'event_key' => 'del_issue' ]));
+ }
+
+ // delete linked relation
+ DB::collection('linked')->where('src', $id)->orWhere('dest', $id)->delete();
+
+ // delete this issue
+ DB::collection($table)->where('_id', $id)->update([ 'del_flg' => 1 ]);
+
+ // delete watch
+ Watch::where('issue_id', $id)->delete();
+
+ // trigger event of issue deleted
+ Event::dispatch(new IssueEvent($project_key, $id, $user, [ 'event_key' => 'del_issue' ]));
+ }
+
+ return Response()->json([ 'ecode' => 0, 'data' => [ 'ids' => $ids ] ]);
+ }
+
+ /**
+ * batch update the issue
+ *
+ * @param string $project_key
+ * @param array $ids
+ * @param array $values
+ * @return \Illuminate\Http\Response
+ */
+ public function batchUpdate($project_key, $ids, $values)
+ {
+ if (!$this->isPermissionAllowed($project_key, 'edit_issue'))
+ {
+ return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
+ }
+
+ $schemas = [];
+
+ $updValues = [];
+ if (isset($values['type']))
+ {
+ if (!$values['type'])
+ {
+ throw new \UnexpectedValueException('the issue type can not be empty.', -11100);
+ }
+
+ if (!($schemas[$values['type']] = Provider::getSchemaByType($values['type'])))
+ {
+ throw new \UnexpectedValueException('the schema of the type is not existed.', -11101);
+ }
+
+ $updValues['type'] = $values['type'];
+ }
+
+ $new_fields = [];
+ $fields = Provider::getFieldList($project_key);
+ foreach($fields as $field)
+ {
+ $new_fields[$field->key] = $field;
+ }
+ $fields = $new_fields;
+
+ foreach ($values as $key => $val)
+ {
+ if (!isset($fields[$key]) || $fields[$key]->type == 'File')
+ {
+ continue;
+ }
+
+ $field = $fields[$key];
+
+ if ($field->type == 'DateTimePicker' || $field->type == 'DatePicker')
+ {
+ if ($val && $this->isTimestamp($val) === false)
+ {
+ throw new \UnexpectedValueException('the format of datepicker field is incorrect.', -11122);
+ }
+ $updValues[$key] = $val;
+ }
+ else if ($field->type == 'TimeTracking')
+ {
+ if ($val && !$this->ttCheck($val))
+ {
+ throw new \UnexpectedValueException('the format of timetracking field is incorrect.', -11102);
+ }
+ $updValues[$key] = $this->ttHandle($val);
+ $updValues[$key . '_m'] = $this->ttHandleInM($updValues[$key]);
+ }
+ else if ($key == 'assignee' || $field->type == 'SingleUser')
+ {
+ $user_info = Sentinel::findById($val);
+ //便于处理批量传用户的情况
+ if(count($user_info)==1) $user_info = $user_info->first();
+ if ($user_info)
+ {
+ $updValues[$key] = [ 'id' => $val, 'name' => $user_info->first_name, 'email' => $user_info->email ];
+ }
+ }
+ else if ($field->type == 'MultiUser')
+ {
+ $user_ids = $val;
+ $updValues[$key] = [];
+ $new_user_ids = [];
+ foreach ($user_ids as $uid)
+ {
+ $user_info = Sentinel::findById($uid);
+ //便于处理批量传用户的情况
+ if(count($user_info)==1) $user_info = $user_info->first();
+ if ($user_info)
+ {
+ array_push($updValues[$key], [ 'id' => $uid, 'name' => $user_info->first_name, 'email' => $user_info->email ]);
+ }
+ $new_user_ids[] = $uid;
+ }
+ $updValues[$key . '_ids'] = $new_user_ids;
+ }
+ else if ($field->type === 'Number' || $field->type === 'Integer')
+ {
+ if ($val === '')
+ {
+ $updValues[$key] = '';
+ }
+ else
+ {
+ $updValues[$key] = $field->type === 'Number' ? floatVal($val) : intVal($val);
+ }
+ }
+ else
+ {
+ $updValues[$key] = $val;
+ }
+ }
+
+ $updValues['modifier'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $updValues['updated_at'] = time();
+
+ $table = 'issue_' . $project_key;
+ foreach ($ids as $id)
+ {
+ $issue = DB::collection($table)->find($id);
+ if (!$issue)
+ {
+ continue;
+ }
+
+ $schema = [];
+ $type = isset($values['type']) ? $values['type'] : $issue['type'];
+ if (!isset($schemas[$type]))
+ {
+ if (!($schemas[$type] = $schema = Provider::getSchemaByType($type)))
+ {
+ continue;
+ }
+ }
+ else
+ {
+ $schema = $schemas[$type];
+ }
+
+ $valid_keys = $this->getValidKeysBySchema($schema);
+ if (!array_only($updValues, $valid_keys))
+ {
+ continue;
+ }
+
+ DB::collection($table)->where('_id', $id)->update(array_only($updValues, $valid_keys));
+
+ // add to histroy table
+ $snap_id = Provider::snap2His($project_key, $id, $schema, array_keys(array_only($values, $valid_keys)));
+
+ // trigger event of issue edited
+ Event::dispatch(new IssueEvent($project_key, $id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ }
+
+ // create the Labels for project
+ if (isset($updValues['labels']) && $updValues['labels'])
+ {
+ $this->createLabels($project_key, $updValues['labels']);
+ }
+
+ return Response()->json([ 'ecode' => 0, 'data' => [ 'ids' => $ids ] ]);
+ }
}
diff --git a/app/Http/Controllers/LabelsController.php b/app/Http/Controllers/LabelsController.php
new file mode 100755
index 000000000..897f66ba2
--- /dev/null
+++ b/app/Http/Controllers/LabelsController.php
@@ -0,0 +1,228 @@
+middleware('privilege:manage_project');
+ parent::__construct();
+ }
+
+ /**
+ * Display a listing of the resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function index(Request $request, $project_key)
+ {
+ $labels = Labels::where([ 'project_key' => $project_key ])->orderBy('_id', 'asc')->get();
+ foreach ($labels as $key => $label)
+ {
+ $label->is_used = $this->isFieldUsedByIssue($project_key, 'labels', $label->toArray());
+
+ $completed_issue_cnt = $incompleted_issue_cnt = 0;
+ $unresolved_cnt = DB::collection('issue_' . $project_key)
+ ->where('resolution', 'Unresolved')
+ ->where('labels', $label['name'])
+ ->where('del_flg', '<>', 1)
+ ->count();
+ $label->unresolved_cnt = $unresolved_cnt;
+
+ $all_cnt = DB::collection('issue_' . $project_key)
+ ->where('labels', $label['name'])
+ ->where('del_flg', '<>', 1)
+ ->count();
+ $label->all_cnt = $all_cnt;
+ }
+
+ return Response()->json([ 'ecode' => 0, 'data' => $labels ]);
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(Request $request, $project_key)
+ {
+ $name = $request->input('name');
+ if (!$name)
+ {
+ throw new \UnexpectedValueException('the name can not be empty.', -16100);
+ }
+
+ if (Provider::isLabelExisted($project_key, $name))
+ {
+ throw new \UnexpectedValueException('label name cannot be repeated', -16102);
+ }
+
+ $label = Labels::create([ 'project_key' => $project_key ] + $request->all());
+ return Response()->json(['ecode' => 0, 'data' => $label]);
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function update(Request $request, $project_key, $id)
+ {
+ $name = $request->input('name');
+ if (isset($name))
+ {
+ if (!$name)
+ {
+ throw new \UnexpectedValueException('the name can not be empty.', -16100);
+ }
+ }
+
+ $label = Labels::find($id);
+ if (!$label || $project_key != $label->project_key)
+ {
+ throw new \UnexpectedValueException('the label does not exist or is not in the project.', -16103);
+ }
+
+ if ($label->name !== $name && Provider::isLabelExisted($project_key, $name))
+ {
+ throw new \UnexpectedValueException('label name cannot be repeated', -16102);
+ }
+
+ if ($label->name !== $name)
+ {
+ $this->updIssueLabels($project_key, $label->name, $name);
+ }
+
+ $label->fill($request->except(['project_key']))->save();
+
+ return Response()->json(['ecode' => 0, 'data' => Labels::find($id)]);
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function delete(Request $request, $project_key, $id)
+ {
+ $label = Labels::find($id);
+ if (!$label || $project_key != $label->project_key)
+ {
+ throw new \UnexpectedValueException('the label does not exist or is not in the project.', -16103);
+ }
+
+ $operate_flg = $request->input('operate_flg');
+ if (!isset($operate_flg) || $operate_flg === '0')
+ {
+ $is_used = $this->isFieldUsedByIssue($project_key, 'labels', $label->toArray());
+ if ($is_used)
+ {
+ throw new \UnexpectedValueException('the label has been used by some issues.', -16104);
+ }
+ }
+ else if ($operate_flg === '1')
+ {
+ $swap_label = $request->input('swap_label');
+ if (!isset($swap_label) || !$swap_label)
+ {
+ throw new \UnexpectedValueException('the swap label cannot be empty.', -16106);
+ }
+
+ $slabel = Labels::find($swap_label);
+ if (!$slabel || $project_key != $slabel->project_key)
+ {
+ throw new \UnexpectedValueException('the swap label does not exist or is not in the project.', -16107);
+ }
+
+ $this->updIssueLabels($project_key, $label->name, $slabel->name);
+ }
+ else if ($operate_flg === '2')
+ {
+ $this->updIssueLabels($project_key, $label->name, '');
+ }
+ else
+ {
+ throw new \UnexpectedValueException('the operation has error.', -16105);
+ }
+
+ Labels::destroy($id);
+
+ return Response()->json(['ecode' => 0, 'data' => [ 'id' => $id ]]);
+
+ //if ($operate_flg === '1')
+ //{
+ // return $this->show($project_key, $request->input('swap_label'));
+ //}
+ //else
+ //{
+ // return Response()->json(['ecode' => 0, 'data' => [ 'id' => $id ]]);
+ //}
+ }
+
+ /**
+ * update the issues label
+ *
+ * @param array $issues
+ * @param string $source
+ * @param string $dest
+ * @return \Illuminate\Http\Response
+ */
+ public function updIssueLabels($project_key, $source, $dest)
+ {
+ $issues = DB::collection('issue_' . $project_key)
+ ->where('labels', $source)
+ ->where('del_flg', '<>', 1)
+ ->get();
+
+ foreach ($issues as $issue)
+ {
+ $updValues = [];
+
+ $newLabels = [];
+ foreach ($issue['labels'] as $label)
+ {
+ if ($source == $label)
+ {
+ if ($dest)
+ {
+ $newLabels[] = $dest;
+ }
+ }
+ else
+ {
+ $newLabels[] = $label;
+ }
+ }
+ $updValues['labels'] = array_values(array_unique(array_filter($newLabels)));
+
+ $updValues['modifier'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $updValues['updated_at'] = time();
+
+ $issue_id = $issue['_id']->__toString();
+
+ DB::collection('issue_' . $project_key)->where('_id', $issue_id)->update($updValues);
+ // add to histroy table
+ $snap_id = Provider::snap2His($project_key, $issue_id, [], [ 'labels' ]);
+ // trigger event of issue edited
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ }
+ }
+}
diff --git a/app/Http/Controllers/LinkController.php b/app/Http/Controllers/LinkController.php
old mode 100644
new mode 100755
index 53f592bad..f0c4f872b
--- a/app/Http/Controllers/LinkController.php
+++ b/app/Http/Controllers/LinkController.php
@@ -32,21 +32,21 @@ public function store(Request $request, $project_key)
$src = $request->input('src');
if (!$src)
{
- throw new \UnexpectedValueException('the src issue value can not be empty.', -11121);
+ throw new \UnexpectedValueException('the src issue value can not be empty.', -11151);
}
$values['src'] = $src;
$relations = ['blocks', 'is blocked by', 'clones', 'is cloned by', 'duplicates', 'is duplicated by', 'relates to'];
$relation = $request->input('relation');
if (!$relation || !in_array($relation, $relations)) {
- throw new \UnexpectedValueException('the relation value has error.', -11123);
+ throw new \UnexpectedValueException('the relation value has error.', -11153);
}
$values['relation'] = $relation;
$dest = $request->input('dest');
if (!$dest)
{
- throw new \UnexpectedValueException('the dest issue value can not be empty.', -11122);
+ throw new \UnexpectedValueException('the dest issue value can not be empty.', -11152);
}
$values['dest'] = $dest;
@@ -55,7 +55,7 @@ public function store(Request $request, $project_key)
$isExists = Linked::whereRaw([ 'src' => $src, 'dest' => $dest ])->exists();
if ($isExists || Linked::whereRaw([ 'dest' => $src, 'src' => $dest ])->exists())
{
- throw new \UnexpectedValueException('the relation of two issues has been exists.', -11124);
+ throw new \UnexpectedValueException('the relation of two issues has been exists.', -11154);
}
$ret = Linked::create($values);
@@ -71,7 +71,7 @@ public function store(Request $request, $project_key)
$link['dest'] = array_only($dest_issue, ['_id', 'no', 'type', 'title', 'state']);
// trigger event of issue linked
- Event::fire(new IssueEvent($project_key, $src, $values['creator'], [ 'event_key' => 'create_link', 'data' => [ 'dest' => $dest, 'relation' => $relation ]]));
+ Event::dispatch(new IssueEvent($project_key, $src, $values['creator'], [ 'event_key' => 'create_link', 'data' => [ 'dest' => $dest, 'relation' => $relation ]]));
return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($link) ]);
}
@@ -87,13 +87,13 @@ public function destroy($project_key, $id)
$link = Linked::find($id);
if (!$link)
{
- throw new \UnexpectedValueException('the link does not exist or is not in the project.', -11125);
+ throw new \UnexpectedValueException('the link does not exist or is not in the project.', -11155);
}
Linked::destroy($id);
// trigger event of issue created
$user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new IssueEvent($project_key, $link->src, $user, [ 'event_key' => 'del_link', 'data' => [ 'dest' => $link->dest, 'relation' => $link->relation ]]));
+ Event::dispatch(new IssueEvent($project_key, $link->src, $user, [ 'event_key' => 'del_link', 'data' => [ 'dest' => $link->dest, 'relation' => $link->relation ]]));
return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
diff --git a/app/Http/Controllers/ModuleController.php b/app/Http/Controllers/ModuleController.php
old mode 100644
new mode 100755
index d64b9f452..7e73d7c6e
--- a/app/Http/Controllers/ModuleController.php
+++ b/app/Http/Controllers/ModuleController.php
@@ -4,7 +4,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Event;
-
+use Illuminate\Support\Arr;
//use App\Events\ModuleEvent;
use App\Events\IssueEvent;
use App\Http\Requests;
@@ -74,7 +74,7 @@ public function store(Request $request, $project_key)
'creator' => $creator ] + $request->all());
// trigger event of version added
- //Event::fire(new ModuleEvent($project_key, $creator, [ 'event_key' => 'create_module', 'data' => $module->name ]));
+ //Event::dispatch(new ModuleEvent($project_key, $creator, [ 'event_key' => 'create_module', 'data' => $module->name ]));
return Response()->json([ 'ecode' => 0, 'data' => $module ]);
}
@@ -139,11 +139,11 @@ public function update(Request $request, $project_key, $id)
$principal = isset($module['principal']) ? $module['principal'] : [];
}
- $module->fill([ 'principal' => $principal ] + array_except($request->all(), [ 'creator', 'project_key' ]))->save();
+ $module->fill([ 'principal' => $principal ] + Arr::except($request->all(), [ 'creator', 'project_key' ]))->save();
// trigger event of module edited
//$cur_user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- //Event::fire(new ModuleEvent($project_key, $cur_user, [ 'event_key' => 'edit_module', 'data' => $request->all() ]));
+ //Event::dispatch(new ModuleEvent($project_key, $cur_user, [ 'event_key' => 'edit_module', 'data' => $request->all() ]));
return Response()->json([ 'ecode' => 0, 'data' => Module::find($id) ]);
}
@@ -201,7 +201,7 @@ public function delete(Request $request, $project_key, $id)
// trigger event of module deleted
//$cur_user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- //Event::fire(new ModuleEvent($project_key, $cur_user, [ 'event_key' => 'del_module', 'data' => $module->name ]));
+ //Event::dispatch(new ModuleEvent($project_key, $cur_user, [ 'event_key' => 'del_module', 'data' => $module->name ]));
if ($operate_flg === '1')
{
@@ -255,7 +255,7 @@ public function updIssueModule($project_key, $source, $dest)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $issue_id, [], [ 'module' ]);
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
}
}
}
diff --git a/app/Http/Controllers/MysettingController.php b/app/Http/Controllers/MysettingController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/PriorityController.php b/app/Http/Controllers/PriorityController.php
old mode 100644
new mode 100755
index 0facce5a8..345616070
--- a/app/Http/Controllers/PriorityController.php
+++ b/app/Http/Controllers/PriorityController.php
@@ -52,7 +52,7 @@ public function store(Request $request, $project_key)
$priority = Priority::create([ 'project_key' => $project_key, 'sn' => time() ] + $request->all());
// trigger to change priority field config
- // Event::fire(new PriorityConfigChangeEvent($project_key));
+ // Event::dispatch(new PriorityConfigChangeEvent($project_key));
return Response()->json(['ecode' => 0, 'data' => $priority]);
}
@@ -107,7 +107,7 @@ public function update(Request $request, $project_key, $id)
$priority->fill($request->except(['project_key']))->save();
// trigger to change priority field config
- // Event::fire(new PriorityConfigChangeEvent($project_key));
+ // Event::dispatch(new PriorityConfigChangeEvent($project_key));
return Response()->json(['ecode' => 0, 'data' => Priority::find($id)]);
}
@@ -162,7 +162,7 @@ public function destroy($project_key, $id)
}
// trigger to change priority field config
- // Event::fire(new PriorityConfigChangeEvent($project_key));
+ // Event::dispatch(new PriorityConfigChangeEvent($project_key));
return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php
old mode 100644
new mode 100755
index f0ed18b8d..4ca57c4ec
--- a/app/Http/Controllers/ProjectController.php
+++ b/app/Http/Controllers/ProjectController.php
@@ -25,11 +25,12 @@
use MongoDB\BSON\ObjectID;
use MongoDB\Model\CollectionInfo;
+
class ProjectController extends Controller
{
public function __construct()
{
- $this->middleware('privilege:sys_admin', [ 'only' => [ 'index', 'getOptions', 'updMultiStatus', 'createMultiIndex', 'destroy' ] ]);
+ $this->middleware('privilege:sys_admin', ['only' => ['index', 'getOptions', 'updMultiStatus', 'createMultiIndex', 'destroy']]);
parent::__construct();
}
@@ -41,8 +42,9 @@ public function __construct()
public function recent(Request $request)
{
// get bound groups
+
$group_ids = array_column(Acl::getBoundGroups($this->user->id), 'id');
- $user_projects = UserGroupProject::whereIn('ug_id', array_merge($group_ids, [ $this->user->id ]))
+ $user_projects = UserGroupProject::whereIn('ug_id', array_merge($group_ids, [$this->user->id]))
->where('link_count', '>', 0)
->get(['project_key'])
->toArray();
@@ -58,19 +60,19 @@ public function recent(Request $request)
$new_accessed_pkeys = array_unique(array_intersect($accessed_pkeys, $pkeys));
$projects = [];
- foreach ($new_accessed_pkeys as $pkey)
- {
+ foreach ($new_accessed_pkeys as $pkey) {
$project = Project::where('key', $pkey)->first();
- if (!$project || $project->status === 'closed')
- {
+ if (!$project || $project->status != 'active') {
continue;
}
- $projects[] = [ 'key' => $project->key, 'name' => $project->name ];
- if (count($projects) >= 5) { break; }
+ $projects[] = ['key' => $project->key, 'name' => $project->name];
+ if (count($projects) >= 5) {
+ break;
+ }
}
- return Response()->json([ 'ecode' => 0, 'data' => $projects ]);
+ return Response()->json(['ecode' => 0, 'data' => $projects]);
}
/**
@@ -83,7 +85,7 @@ public function myproject(Request $request)
// get bound groups
$group_ids = array_column(Acl::getBoundGroups($this->user->id), 'id');
// fix me
- $user_projects = UserGroupProject::whereIn('ug_id', array_merge($group_ids, [ $this->user->id ]))
+ $user_projects = UserGroupProject::whereIn('ug_id', array_merge($group_ids, [$this->user->id]))
->where('link_count', '>', 0)
->orderBy('created_at', 'asc')
->get(['project_key'])
@@ -91,72 +93,180 @@ public function myproject(Request $request)
$pkeys = array_values(array_unique(array_column($user_projects, 'project_key')));
+ $sortkey = $request->input('sortkey');
+ if (isset($sortkey) && $sortkey) {
+ $pkey_cnts = [];
+ if ($sortkey == 'all_issues_cnt') {
+ foreach ($pkeys as $pkey) {
+ $pkey_cnts[$pkey] = DB::collection('issue_' . $pkey)
+ ->where('del_flg', '<>', 1)
+ ->count();
+ }
+ } else if ($sortkey == 'unresolved_issues_cnt') {
+ foreach ($pkeys as $pkey) {
+ $pkey_cnts[$pkey] = DB::collection('issue_' . $pkey)
+ ->where('del_flg', '<>', 1)
+ ->where('resolution', 'Unresolved')
+ ->count();
+ }
+ } else if ($sortkey == 'assigntome_issues_cnt') {
+ foreach ($pkeys as $pkey) {
+ $pkey_cnts[$pkey] = DB::collection('issue_' . $pkey)
+ ->where('del_flg', '<>', 1)
+ ->where('resolution', 'Unresolved')
+ ->where('assignee.id', $this->user->id)
+ ->count();
+ }
+ } else if ($sortkey == 'activity') {
+ $twoWeeksAgo = strtotime(date('Ymd', strtotime('-2 week')));
+ foreach ($pkeys as $pkey) {
+ $pkey_cnts[$pkey] = DB::collection('activity_' . $pkey)
+ ->where('created_at', '>=', $twoWeeksAgo)
+ ->count();
+ }
+ } else if ($sortkey == 'key_asc') {
+ sort($pkeys);
+ } else if ($sortkey == 'key_desc') {
+ rsort($pkeys);
+ } else if ($sortkey == 'create_time_asc') {
+ $project_keys = Project::whereIn('key', $pkeys)
+ ->orderBy('created_at', 'asc')
+ ->get(['key'])
+ ->toArray();
+ $pkeys = array_column($project_keys, 'key');
+ } else if ($sortkey == 'create_time_desc') {
+ $project_keys = Project::whereIn('key', $pkeys)
+ ->orderBy('created_at', 'desc')
+ ->get(['key'])
+ ->toArray();
+ $pkeys = array_column($project_keys, 'key');
+ }
+
+ if ($pkey_cnts) {
+ arsort($pkey_cnts);
+ $pkeys = array_keys($pkey_cnts);
+ }
+ }
+
$offset_key = $request->input('offset_key');
- if (isset($offset_key))
- {
+ if (isset($offset_key)) {
$ind = array_search($offset_key, $pkeys);
- if ($ind === false)
- {
+ if ($ind === false) {
$pkeys = [];
- }
- else
- {
- $pkeys = array_slice($pkeys, $ind + 1);
+ } else {
+ $pkeys = array_slice($pkeys, $ind + 1);
}
}
$limit = $request->input('limit');
- if (!isset($limit))
- {
- $limit = 36;
+ if (!isset($limit)) {
+ $limit = 24;
}
$limit = intval($limit);
$status = $request->input('status');
- if (!isset($status))
- {
+ if (!isset($status)) {
$status = 'all';
}
$name = $request->input('name');
$projects = [];
- foreach ($pkeys as $pkey)
- {
+ foreach ($pkeys as $pkey) {
$query = Project::where('key', $pkey);
- if ($name)
- {
+ if ($name) {
$query->where(function ($query) use ($name) {
$query->where('key', 'like', '%' . $name . '%')->orWhere('name', 'like', '%' . $name . '%');
});
}
- if ($status != 'all')
- {
+ if ($status != 'all') {
$query = $query->where('status', $status);
}
$project = $query->first();
- if (!$project)
- {
+ if (!$project) {
continue;
}
$projects[] = $project->toArray();
- if (count($projects) >= $limit)
- {
+ if (count($projects) >= $limit) {
break;
}
}
-
- foreach ($projects as $key => $project)
- {
+
+ foreach ($projects as $key => $project) {
$projects[$key]['principal']['nameAndEmail'] = $project['principal']['name'] . '(' . $project['principal']['email'] . ')';
}
$syssetting = SysSetting::first();
$allow_create_project = isset($syssetting->properties['allow_create_project']) ? $syssetting->properties['allow_create_project'] : 0;
- return Response()->json([ 'ecode' => 0, 'data' => $projects, 'options' => [ 'limit' => $limit, 'allow_create_project' => $allow_create_project ] ]);
+ return Response()->json(['ecode' => 0, 'data' => $projects, 'options' => ['limit' => $limit, 'allow_create_project' => $allow_create_project]]);
+ }
+
+ /**
+ * get the stats of the projects.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function stats(Request $request)
+ {
+ $keys = $request->input('keys');
+
+ $trend = [];
+ $t = strtotime('-2 week');
+ while ($t <= time()) {
+ $ymd = date('Y/m/d', $t);
+ $trend[$ymd] = ['new' => 0];
+ $t += 24 * 3600;
+ }
+
+ $twoWeeksAgo = strtotime(date('Ymd', strtotime('-2 week')));
+
+ $stats = [];
+
+ $pkeys = explode(',', $keys);
+ foreach ($pkeys as $pkey) {
+ $all_cnt = DB::collection('issue_' . $pkey)
+ ->where('del_flg', '<>', 1)
+ ->count();
+
+ $unresolved_cnt = DB::collection('issue_' . $pkey)
+ ->where('del_flg', '<>', 1)
+ ->where('resolution', 'Unresolved')
+ ->count();
+
+ $assigntome_cnt = DB::collection('issue_' . $pkey)
+ ->where('del_flg', '<>', 1)
+ ->where('resolution', 'Unresolved')
+ ->where('assignee.id', $this->user->id)
+ ->count();
+
+ $trend_issues = DB::collection('issue_' . $pkey)
+ ->where('created_at', '>=', $twoWeeksAgo)
+ ->where('del_flg', '<>', 1)
+ ->get(['created_at']);
+
+ $tmp_trend = $trend;
+ foreach ($trend_issues as $issue) {
+ $created_date = date('Y/m/d', $issue['created_at']);
+ $tmp_trend[$created_date]['new'] += 1;
+ }
+
+ $new_trend = [];
+ foreach ($tmp_trend as $day => $new_cnt) {
+ $new_trend[] = ['day' => $day, 'new' => $new_cnt['new']];
+ }
+
+ $stats[$pkey] = ['all' => $all_cnt, 'unresolved' => $unresolved_cnt, 'assigntome' => $assigntome_cnt, 'trend' => $new_trend];
+ }
+
+ $new_stats = [];
+ foreach ($stats as $key => $val) {
+ $new_stats[] = ['key' => $key, 'stats' => $val];
+ }
+
+ return Response()->json(['ecode' => 0, 'data' => $new_stats]);
}
/**
@@ -166,11 +276,10 @@ public function myproject(Request $request)
*/
public function getOptions(Request $request)
{
- $principals = Project::distinct('principal')->get([ 'principal' ])->toArray();
+ $principals = Project::distinct('principal')->get(['principal'])->toArray();
$newPrincipals = [];
- foreach ($principals as $principal)
- {
+ foreach ($principals as $principal) {
$tmp = [];
$tmp['id'] = $principal['id'];
$tmp['name'] = $principal['name'];
@@ -178,7 +287,7 @@ public function getOptions(Request $request)
$newPrincipals[] = $tmp;
}
- return Response()->json([ 'ecode' => 0, 'data' => [ 'principals' => $newPrincipals ] ]);
+ return Response()->json(['ecode' => 0, 'data' => ['principals' => $newPrincipals]]);
}
/**
@@ -189,16 +298,14 @@ public function getOptions(Request $request)
public function createIndex(Request $request, $id)
{
$project = Project::find($id);
- if (!$project)
- {
+ if (!$project) {
throw new \UnexpectedValueException('the project does not exist.', -14006);
}
- if ($project->principal['id'] !== $this->user->id && !$this->user->hasAccess('sys_admin'))
- {
+ if ($project->principal['id'] !== $this->user->id && !$this->user->hasAccess('sys_admin')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
- Schema::collection('issue_' . $project->key, function($col) {
+ Schema::collection('issue_' . $project->key, function ($col) {
$col->index('type');
$col->index('state');
$col->index('resolution');
@@ -214,23 +321,23 @@ public function createIndex(Request $request, $id)
$col->index('assignee.id');
$col->index('reporter.id');
});
- Schema::collection('activity_' . $project->key, function($col) {
+ Schema::collection('activity_' . $project->key, function ($col) {
$col->index('event_key');
});
- Schema::collection('comments_' . $project->key, function($col) {
+ Schema::collection('comments_' . $project->key, function ($col) {
$col->index('issue_id');
});
- Schema::collection('issue_his_' . $project->key, function($col) {
+ Schema::collection('issue_his_' . $project->key, function ($col) {
$col->index('issue_id');
});
- Schema::collection('document_' . $project->key, function($col) {
+ Schema::collection('document_' . $project->key, function ($col) {
$col->index('parent');
});
- Schema::collection('wiki_' . $project->key, function($col) {
+ Schema::collection('wiki_' . $project->key, function ($col) {
$col->index('parent');
});
- return Response()->json([ 'ecode' => 0, 'data' => $project ]);
+ return Response()->json(['ecode' => 0, 'data' => $project]);
}
/**
@@ -241,20 +348,17 @@ public function createIndex(Request $request, $id)
public function createMultiIndex(Request $request)
{
$ids = $request->input('ids');
- if (!isset($ids) || !$ids)
- {
+ if (!isset($ids) || !$ids) {
throw new \InvalidArgumentException('the selected projects cannot been empty.', -14007);
}
- foreach ($ids as $id)
- {
+ foreach ($ids as $id) {
$project = Project::find($id);
- if (!$project)
- {
+ if (!$project) {
continue;
}
- Schema::collection('issue_' . $project->key, function($col) {
+ Schema::collection('issue_' . $project->key, function ($col) {
$col->index('type');
$col->index('state');
$col->index('resolution');
@@ -269,23 +373,23 @@ public function createMultiIndex(Request $request)
$col->index('assignee.id');
$col->index('reporter.id');
});
- Schema::collection('activity_' . $project->key, function($col) {
+ Schema::collection('activity_' . $project->key, function ($col) {
$col->index('event_key');
});
- Schema::collection('comments_' . $project->key, function($col) {
+ Schema::collection('comments_' . $project->key, function ($col) {
$col->index('issue_id');
});
- Schema::collection('issue_his_' . $project->key, function($col) {
+ Schema::collection('issue_his_' . $project->key, function ($col) {
$col->index('issue_id');
});
- Schema::collection('document_' . $project->key, function($col) {
+ Schema::collection('document_' . $project->key, function ($col) {
$col->index('parent');
});
- Schema::collection('wiki_' . $project->key, function($col) {
+ Schema::collection('wiki_' . $project->key, function ($col) {
$col->index('parent');
});
}
- return Response()->json([ 'ecode' => 0, 'data' => [ 'ids' => $ids ] ]);
+ return Response()->json(['ecode' => 0, 'data' => ['ids' => $ids]]);
}
/**
@@ -296,26 +400,23 @@ public function createMultiIndex(Request $request)
public function updMultiStatus(Request $request)
{
$ids = $request->input('ids');
- if (!isset($ids) || !$ids)
- {
+ if (!isset($ids) || !$ids) {
throw new \InvalidArgumentException('the selected projects cannot been empty.', -14007);
}
$status = $request->input('status');
- if (!isset($status) || !$status)
- {
+ if (!isset($status) || !$status) {
throw new \InvalidArgumentException('the status cannot be empty.', -14008);
}
$newIds = [];
- foreach ($ids as $id)
- {
+ foreach ($ids as $id) {
$newIds[] = new ObjectID($id);
}
- Project::whereRaw([ '_id' => [ '$in' => $newIds ] ])->update([ 'status' => $status ]);
+ Project::whereRaw(['_id' => ['$in' => $newIds]])->update(['status' => $status]);
- return Response()->json([ 'ecode' => 0, 'data' => [ 'ids' => $ids ] ]);
+ return Response()->json(['ecode' => 0, 'data' => ['ids' => $ids]]);
}
/**
@@ -328,16 +429,15 @@ public function search(Request $request)
$query = DB::collection('project');
$s = $request->input('s');
- if (isset($s) && $s)
- {
+ if (isset($s) && $s) {
$query->where(function ($query) use ($s) {
$query->where('key', 'like', '%' . $s . '%')->orWhere('name', 'like', '%' . $s . '%');
});
}
- $projects = $query->take(10)->get([ 'name', 'key' ]);
+ $projects = $query->take(10)->get(['name', 'key']);
- return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($projects) ]);
+ return Response()->json(['ecode' => 0, 'data' => parent::arrange($projects)]);
}
/**
@@ -350,20 +450,17 @@ public function index(Request $request)
$query = DB::collection('project');
$principal_id = $request->input('principal_id');
- if (isset($principal_id) && $principal_id)
- {
+ if (isset($principal_id) && $principal_id) {
$query = $query->where('principal.id', $principal_id);
}
$status = $request->input('status');
- if (isset($status) && $status !== 'all')
- {
+ if (isset($status) && $status !== 'all') {
$query = $query->where('status', $status);
}
$name = $request->input('name');
- if (isset($name) && $name)
- {
+ if (isset($name) && $name) {
$query->where(function ($query) use ($name) {
$query->where('key', 'like', '%' . $name . '%')->orWhere('name', 'like', '%' . $name . '%');
});
@@ -377,13 +474,12 @@ public function index(Request $request)
$page_size = 30;
$page = $request->input('page') ?: 1;
$query = $query->skip($page_size * ($page - 1))->take($page_size);
- $projects = $query->get([ 'name', 'key', 'description', 'status', 'principal' ]);
- foreach ($projects as $key => $project)
- {
+ $projects = $query->get(['name', 'key', 'description', 'status', 'principal']);
+ foreach ($projects as $key => $project) {
$projects[$key]['principal']['nameAndEmail'] = $project['principal']['name'] . '(' . $project['principal']['email'] . ')';
}
- return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($projects), 'options' => [ 'total' => $total, 'sizePerPage' => $page_size ] ]);
+ return Response()->json(['ecode' => 0, 'data' => parent::arrange($projects), 'options' => ['total' => $total, 'sizePerPage' => $page_size]]);
}
/**
@@ -395,70 +491,64 @@ public function index(Request $request)
public function store(Request $request)
{
$syssetting = SysSetting::first();
- $allow_create_project = isset($syssetting->properties['allow_create_project']) ? $syssetting->properties['allow_create_project'] : 0;
- if ($allow_create_project !== 1 && !$this->user->hasAccess('sys_admin'))
- {
+ $allow_create_project = isset($syssetting->properties['allow_create_project']) ? $syssetting->properties['allow_create_project'] : 0;
+ if ($allow_create_project !== 1 && !$this->user->hasAccess('sys_admin')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
$insValues = [];
$name = $request->input('name');
- if (!$name)
- {
+ if (!$name) {
throw new \UnexpectedValueException('the name can not be empty.', -14000);
}
$insValues['name'] = $name;
$key = $request->input('key');
- if (!$key)
- {
+ if (!$key) {
throw new \InvalidArgumentException('project key cannot be empty.', -14001);
}
- if (Project::Where('key', $key)->exists())
- {
+ if (Project::Where('key', $key)->exists()) {
throw new \InvalidArgumentException('project key has been taken.', -14002);
}
$insValues['key'] = $key;
$principal = $request->input('principal');
- if (!isset($principal) || !$principal)
- {
- $insValues['principal'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- }
- else
- {
- $principal_info = Sentinel::findById($principal);
- if (!$principal_info)
- {
- throw new \InvalidArgumentException('the user is not exists.', -14003);
+ if (isset($principal) && $principal) {
+ if ($principal == 'self') {
+ $insValues['principal'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
+ } else {
+ $principal_info = Sentinel::findById($principal);
+ if (!$principal_info) {
+ throw new \InvalidArgumentException('the user is not exists.', -14003);
+ }
+ $insValues['principal'] = ['id' => $principal_info->id, 'name' => $principal_info->first_name, 'email' => $principal_info->email];
}
- $insValues['principal'] = [ 'id' => $principal_info->id, 'name' => $principal_info->first_name, 'email' => $principal_info->email ];
+ } else {
+ $insValues['principal'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
}
$description = $request->input('description');
- if (isset($description) && $description)
- {
+ if (isset($description) && $description) {
$insValues['description'] = $description;
}
$insValues['category'] = 1;
$insValues['status'] = 'active';
- $insValues['creator'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $insValues['creator'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
// save the project
$project = Project::create($insValues); //fix me
// add issue-type template to project
$this->initialize($project->key);
// trigger add user to usrproject
- Event::fire(new AddUserToRoleEvent([ $insValues['principal']['id'] ], $key));
+ Event::dispatch(new AddUserToRoleEvent([$insValues['principal']['id']], $key));
- if (isset($project->principal))
- {
- $project->principal = array_merge($insValues['principal'], [ 'nameAndEmail' => $insValues['principal']['name'] . '(' . $insValues['principal']['email'] . ')' ]);
+ if (isset($project->principal)) {
+ $project->principal = array_merge($insValues['principal'], ['nameAndEmail' => $insValues['principal']['name'] . '(' . $insValues['principal']['email'] . ')']);
}
- return Response()->json([ 'ecode' => 0, 'data' => $project ]);
+ return Response()->json(['ecode' => 0, 'data' => $project]);
}
/**
@@ -471,9 +561,8 @@ public function store(Request $request)
public function initialize($key)
{
$types = Type::where('project_key', '$_sys_$')->get()->toArray();
- foreach ($types as $type)
- {
- Type::create(array_only($type, [ 'name', 'abb', 'screen_id', 'workflow_id', 'sn', 'type', 'disabled', 'default' ]) + [ 'project_key' => $key ]);
+ foreach ($types as $type) {
+ Type::create(array_only($type, ['name', 'abb', 'screen_id', 'workflow_id', 'sn', 'type', 'disabled', 'default']) + ['project_key' => $key]);
}
}
@@ -486,24 +575,26 @@ public function initialize($key)
public function show($key)
{
$project = Project::where('key', $key)->first();
- if (!$project)
- {
+ if (!$project) {
return Response()->json(['ecode' => -14004, 'emsg' => 'the project does not exist.']);
}
- if ($project->status !== 'active')
- {
- return Response()->json(['ecode' => -14009, 'emsg' => 'the project has been closed.']);
- }
+ //if ($project->status !== 'active')
+ //{
+ // return Response()->json(['ecode' => -14009, 'emsg' => 'the project has been archived.']);
+ //}
// get action allow of the project.
$permissions = Acl::getPermissions($this->user->id, $project->key);
- if ($this->user->id === $project->principal['id'] || $this->user->email === 'admin@action.view')
- {
+ if ($this->user->id === $project->principal['id'] || $this->user->email === 'admin@action.view') {
!in_array('view_project', $permissions) && $permissions[] = 'view_project';
!in_array('manage_project', $permissions) && $permissions[] = 'manage_project';
}
+ if ($project->status != 'active') {
+ $permissions = array_values(array_intersect($permissions, ['view_project', 'download_file']));
+ }
+
//if (!$permissions)
//{
// $isMember = UserProject::where('user_id', $this->user->id)
@@ -533,15 +624,14 @@ public function show($key)
//$types = Provider::getTypeListExt($project->key, [ 'assignee' => $users, 'state' => $states, 'resolution' => $resolutions, 'priority' => $priorities, 'version' => $versions, 'module' => $modules ]);
// record the project access date
- if (in_array('view_project', $permissions))
- {
+ if (in_array('view_project', $permissions) && $project->status == 'active') {
AccessProjectLog::where('project_key', $key)
->where('user_id', $this->user->id)
->delete();
- AccessProjectLog::create([ 'project_key' => $key, 'user_id' => $this->user->id, 'latest_access_time' => time() ]);
+ AccessProjectLog::create(['project_key' => $key, 'user_id' => $this->user->id, 'latest_access_time' => time()]);
}
- return Response()->json([ 'ecode' => 0, 'data' => $project, 'options' => parent::arrange([ 'permissions' => $permissions ]) ]);
+ return Response()->json(['ecode' => 0, 'data' => $project, 'options' => parent::arrange(['permissions' => $permissions])]);
}
/**
@@ -555,66 +645,57 @@ public function update(Request $request, $id)
{
$updValues = [];
$name = $request->input('name');
- if (isset($name))
- {
- if (!$name)
- {
+ if (isset($name)) {
+ if (!$name) {
throw new \UnexpectedValueException('the name can not be empty.', -14000);
}
$updValues['name'] = $name;
}
// check is user is available
$principal = $request->input('principal');
- if (isset($principal))
- {
- if (!$principal)
- {
+ if (isset($principal)) {
+ if (!$principal) {
throw new \InvalidArgumentException('the principal must be appointed.', -14005);
}
$principal_info = Sentinel::findById($principal);
- if (!$principal_info)
- {
+ if (!$principal_info) {
throw new \InvalidArgumentException('the user is not exists.', -14003);
}
- $updValues['principal'] = [ 'id' => $principal_info->id, 'name' => $principal_info->first_name, 'email' => $principal_info->email ];
+ $updValues['principal'] = ['id' => $principal_info->id, 'name' => $principal_info->first_name, 'email' => $principal_info->email];
}
$description = $request->input('description');
- if (isset($description))
- {
+ if (isset($description)) {
$updValues['description'] = $description;
}
$status = $request->input('status');
- if (isset($status) && in_array($status, [ 'active', 'closed' ]))
- {
+ if (isset($status) && in_array($status, ['active', 'archived'])) {
$updValues['status'] = $status;
}
$project = Project::find($id);
- if (!$project)
- {
+ if (!$project) {
throw new \UnexpectedValueException('the project does not exist.', -14004);
}
- if ($project->principal['id'] !== $this->user->id && !$this->user->hasAccess('sys_admin'))
- {
+ if ($project->principal['id'] !== $this->user->id && !$this->user->hasAccess('sys_admin')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
$old_principal = $project->principal;
$project->fill($updValues)->save();
- if (isset($principal))
- {
- if ($old_principal['id'] != $principal)
- {
- Event::fire(new AddUserToRoleEvent([ $principal ], $project->key));
- Event::fire(new DelUserFromRoleEvent([ $old_principal['id'] ], $project->key));
+ if (isset($principal)) {
+ if ($old_principal['id'] != $principal) {
+ Event::dispatch(new AddUserToRoleEvent([$principal], $project->key));
+ Event::dispatch(new DelUserFromRoleEvent([$old_principal['id']], $project->key));
}
}
- return Response()->json([ 'ecode' => 0, 'data' => Project::find($id) ]);
+ return $this->show($project->key);
+
+ //return Response()->json([ 'ecode' => 0, 'data' => Project::find($id) ]);
}
/**
@@ -625,30 +706,29 @@ public function update(Request $request, $id)
*/
public function destroy($id)
{
- $project = Project::find($id);
- if (!$project)
- {
+ $project = Project::find($id);
+ if (!$project) {
throw new \UnexpectedValueException('the project does not exist.', -14004);
}
$project_key = $project->key;
//$related_cols = [ 'version', 'module', 'board', 'epic', 'sprint', 'sprint_log', 'searcher', 'access_project_log', 'access_board_log', 'user_group_project', 'watch', 'acl_role', 'acl_roleactor', 'acl_role_permissions', 'oswf_definition' ];
- $unrelated_cols = [ 'system.indexes', 'users', 'persistences', 'throttle', 'project' ];
+ $unrelated_cols = ['system.indexes', 'users', 'persistences', 'throttle', 'project'];
// delete releted table
$collections = DB::listCollections();
- foreach ($collections as $col)
- {
+ foreach ($collections as $col) {
$col_name = $col->getName();
- if (strpos($col_name, 'issue_') === 0 ||
+ if (
+ strpos($col_name, 'issue_') === 0 ||
strpos($col_name, 'activity_') === 0 ||
strpos($col_name, 'comments_') === 0 ||
strpos($col_name, 'document_') === 0 ||
strpos($col_name, 'wiki_') === 0 ||
- in_array($col_name, $unrelated_cols))
- {
+ in_array($col_name, $unrelated_cols)
+ ) {
continue;
}
-
+
DB::collection($col_name)->where('project_key', $project_key)->delete();
}
@@ -662,7 +742,7 @@ public function destroy($id)
// delete from the project table
Project::destroy($id);
- return Response()->json([ 'ecode' => 0, 'data' => [ 'id' => $id ] ]);
+ return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
/**
@@ -673,7 +753,7 @@ public function destroy($id)
*/
public function checkKey($key)
{
- $isExisted = Project::Where('key', $key)->exists();
- return Response()->json([ 'ecode' => 0, 'data' => [ 'flag' => $isExisted ? '2' : '1' ] ]);
+ $isExisted = Project::Where('key', $key)->exists();
+ return Response()->json(['ecode' => 0, 'data' => ['flag' => $isExisted ? '2' : '1']]);
}
}
diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php
old mode 100644
new mode 100755
index ae42c0460..6db255078
--- a/app/Http/Controllers/ReportController.php
+++ b/app/Http/Controllers/ReportController.php
@@ -25,13 +25,13 @@ class ReportController extends Controller
private $default_filters = [
'issues' => [
[ 'id' => 'all_by_type', 'name' => '全部问题/按类型', 'query' => [ 'stat_x' => 'type', 'stat_y' => 'type' ] ],
- [ 'id' => 'unresolved_by_assignee', 'name' => '未解决的/按经办人', 'query' => [ 'stat_x' => 'assignee', 'stat_y' => 'assignee', 'resolution' => 'Unresolved' ] ],
+ [ 'id' => 'unresolved_by_assignee', 'name' => '未解决的/按负责人', 'query' => [ 'stat_x' => 'assignee', 'stat_y' => 'assignee', 'resolution' => 'Unresolved' ] ],
[ 'id' => 'unresolved_by_priority', 'name' => '未解决的/按优先级', 'query' => [ 'stat_x' => 'priority', 'stat_y' => 'priority', 'resolution' => 'Unresolved' ] ],
[ 'id' => 'unresolved_by_module', 'name' => '未解决的/按模块', 'query' => [ 'stat_x' => 'module', 'stat_y' => 'module', 'resolution' => 'Unresolved' ] ]
],
'worklog' => [
[ 'id' => 'all', 'name' => '全部填报', 'query' => [] ],
- [ 'id' => 'in_one_month', 'name' => '过去一个月的', 'query' => [ 'recorded_at' => '1m' ] ],
+ [ 'id' => 'in_one_month', 'name' => '过去一个月的', 'query' => [ 'recorded_at' => '-30d~' ] ],
[ 'id' => 'active_sprint', 'name' => '当前活动Sprint', 'query' => [] ],
[ 'id' => 'latest_completed_sprint', 'name' => '最近已完成Sprint', 'query' => [] ],
//[ 'id' => 'will_release_version', 'name' => '最近要发布版本', 'query' => [] ],
@@ -51,8 +51,8 @@ class ReportController extends Controller
[ 'id' => 'latest_completed_sprint', 'name' => '最近已完成Sprint', 'query' => [] ],
],
'trend' => [
- [ 'id' => 'day_in_one_month', 'name' => '问题每日变化趋势', 'query' => [ 'stat_time' => '1m' ] ],
- [ 'id' => 'week_in_two_months', 'name' => '问题每周变化趋势', 'query' => [ 'stat_time' => '2m', 'interval' => 'week' ] ],
+ [ 'id' => 'day_in_one_month', 'name' => '问题每日变化趋势', 'query' => [ 'stat_time' => '-30d~' ] ],
+ [ 'id' => 'week_in_two_months', 'name' => '问题每周变化趋势', 'query' => [ 'stat_time' => '-60d~', 'interval' => 'week' ] ],
]
];
@@ -341,50 +341,47 @@ public function getWorklogWhere($project_key, $options)
$cond = [];
$recorded_at = isset($options['recorded_at']) ? $options['recorded_at'] : '';
- if ($recorded_at)
+
+ $date_conds = [];
+ $unitMap = [ 'd' => 'day', 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
+ $sections = explode('~', $recorded_at);
+ if ($sections[0])
{
- if (strpos($recorded_at, '~') !== false)
+ $v = $sections[0];
+ $unit = substr($v, -1);
+ if (in_array($unit, [ 'd', 'w', 'm', 'y' ]))
{
- $sections = explode('~', $recorded_at);
- if ($sections[0])
- {
- $cond['$gte'] = strtotime($sections[0]);
- }
- if ($sections[1])
- {
- $cond['$lte'] = strtotime($sections[1] . ' 23:59:59');
- }
- if ($cond)
- {
- $where['recorded_at'] = $cond;
- }
+ $direct = substr($v, 0, 1);
+ $vv = abs(substr($v, 0, -1));
+ $date_conds['$gte'] = strtotime(date('Ymd', strtotime(($direct === '-' ? '-' : '+') . $vv . ' ' . $unitMap[$unit])));
}
else
{
- $unitMap = [ 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
- $unit = substr($recorded_at, -1);
- if (in_array($unit, [ 'w', 'm', 'y' ]))
- {
- $direct = substr($recorded_at, 0, 1);
- $val = abs(substr($recorded_at, 0, -1));
- $time_val = strtotime(date('Ymd', strtotime('-' . $val . ' ' . $unitMap[$unit])));
+ $date_conds['$gte'] = strtotime($v);
+ }
+ }
- if ($direct === '-')
- {
- $cond['$lt'] = $time_val;
- }
- else
- {
- $cond['$gte'] = $time_val;
- }
- if ($cond)
- {
- $where['recorded_at'] = $cond;
- }
- }
+ if (isset($sections[1]) && $sections[1])
+ {
+ $v = $sections[1];
+ $unit = substr($v, -1);
+ if (in_array($unit, [ 'd', 'w', 'm', 'y' ]))
+ {
+ $direct = substr($v, 0, 1);
+ $vv = abs(substr($v, 0, -1));
+ $date_conds['$lte'] = strtotime(date('Y-m-d', strtotime(($direct === '-' ? '-' : '+') . $vv . ' ' . $unitMap[$unit])) . ' 23:59:59');
+ }
+ else
+ {
+ $date_conds['$lte'] = strtotime($v . ' 23:59:59');
}
}
+ if ($date_conds)
+ {
+ $where['recorded_at'] = $date_conds;
+ }
+
$recorder = isset($options['recorder']) ? $options['recorder'] : '';
if ($recorder)
{
@@ -684,7 +681,10 @@ public function getInitializedTrendData($interval, $start_stat_time, $end_stat_t
$singulars = CalendarSingular::where([ 'date' => [ '$in' => $days ] ])->get();
foreach ($singulars as $singular)
{
- $results[$singular->day]['notWorking'] = $singular->type == 'holiday' ? 1 : 0;
+ if (isset($results[$singular->day]))
+ {
+ $results[$singular->day]['notWorking'] = $singular->type == 'holiday' ? 1 : 0;
+ }
}
}
@@ -723,54 +723,48 @@ public function getTrends(Request $request, $project_key)
if (isset($stat_time) && $stat_time)
{
$or = [];
- if (strpos($stat_time, '~') !== false)
+ $date_conds = [];
+ $unitMap = [ 'd' => 'day', 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
+ $sections = explode('~', $stat_time);
+ if ($sections[0])
{
- $cond = [];
- $sections = explode('~', $stat_time);
- if ($sections[0])
- {
- $cond['$gte'] = strtotime($sections[0]);
- $start_stat_time = max([ $start_stat_time, $cond['$gte'] ]);
- }
- if ($sections[1])
+ $v = $sections[0];
+ $unit = substr($v, -1);
+ if (in_array($unit, [ 'd', 'w', 'm', 'y' ]))
{
- $cond['$lte'] = strtotime($sections[1] . ' 23:59:59');
- $end_stat_time = min([ $end_stat_time, $cond['$lte'] ]);
+ $direct = substr($v, 0, 1);
+ $vv = abs(substr($v, 0, -1));
+ $date_conds['$gte'] = strtotime(date('Ymd', strtotime(($direct === '-' ? '-' : '+') . $vv . ' ' . $unitMap[$unit])));
}
- if ($cond)
+ else
{
- $or[] = [ 'created_at' => $cond ];
- $or[] = [ 'resolved_at' => $cond ];
- $or[] = [ 'closed_at' => $cond ];
+ $date_conds['$gte'] = strtotime($v);
}
+ $start_stat_time = max([ $start_stat_time, $date_conds['$gte'] ]);
}
- else
+
+ if (isset($sections[1]) && $sections[1])
{
- $unitMap = [ 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
- $unit = substr($stat_time, -1);
- if (in_array($unit, [ 'w', 'm', 'y' ]))
+ $v = $sections[1];
+ $unit = substr($v, -1);
+ if (in_array($unit, [ 'd', 'w', 'm', 'y' ]))
{
- $direct = substr($stat_time, 0, 1);
- $val = abs(substr($stat_time, 0, -1));
- $time_val = strtotime(date('Ymd', strtotime('-' . $val . ' ' . $unitMap[$unit])));
- $cond = [];
- if ($direct === '-')
- {
- $cond['$lt'] = $time_val;
- $end_stat_time = min([ $end_stat_time, $cond['$lt'] ]);
- }
- else
- {
- $cond['$gte'] = $time_val;
- $start_stat_time = max([ $start_stat_time, $cond['$gte'] ]);
- }
- if ($cond)
- {
- $or[] = [ 'created_at' => $cond ];
- $or[] = [ 'resolved_at' => $cond ];
- $or[] = [ 'closed_at' => $cond ];
- }
+ $direct = substr($v, 0, 1);
+ $vv = abs(substr($v, 0, -1));
+ $date_conds['$lte'] = strtotime(date('Y-m-d', strtotime(($direct === '-' ? '-' : '+') . $vv . ' ' . $unitMap[$unit])) . ' 23:59:59');
}
+ else
+ {
+ $date_conds['$lte'] = strtotime($v . ' 23:59:59');
+ }
+ $end_stat_time = min([ $end_stat_time, $date_conds['$lte'] ]);
+ }
+
+ if ($date_conds)
+ {
+ $or[] = [ 'created_at' => $date_conds ];
+ $or[] = [ 'resolved_at' => $date_conds ];
+ $or[] = [ 'closed_at' => $date_conds ];
}
if (!$is_accu && $or)
diff --git a/app/Http/Controllers/ResolutionController.php b/app/Http/Controllers/ResolutionController.php
old mode 100644
new mode 100755
index 9c6686886..feb05de39
--- a/app/Http/Controllers/ResolutionController.php
+++ b/app/Http/Controllers/ResolutionController.php
@@ -52,7 +52,7 @@ public function store(Request $request, $project_key)
$resolution = Resolution::create([ 'project_key' => $project_key, 'sn' => time() ] + $request->all());
// trigger to change resolution field config
- //Event::fire(new ResolutionConfigChangeEvent($project_key));
+ //Event::dispatch(new ResolutionConfigChangeEvent($project_key));
return Response()->json(['ecode' => 0, 'data' => $resolution]);
}
@@ -107,7 +107,7 @@ public function update(Request $request, $project_key, $id)
$resolution->fill($request->except(['project_key']))->save();
// trigger to change resolution field config
- //Event::fire(new ResolutionConfigChangeEvent($project_key));
+ //Event::dispatch(new ResolutionConfigChangeEvent($project_key));
return Response()->json(['ecode' => 0, 'data' => Resolution::find($id)]);
}
@@ -162,7 +162,7 @@ public function destroy($project_key, $id)
}
// trigger to change resolution field config
- // Event::fire(new ResolutionConfigChangeEvent($project_key));
+ // Event::dispatch(new ResolutionConfigChangeEvent($project_key));
return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
diff --git a/app/Http/Controllers/RoleController.php b/app/Http/Controllers/RoleController.php
old mode 100644
new mode 100755
index 80781c1ed..b3af4bf74
--- a/app/Http/Controllers/RoleController.php
+++ b/app/Http/Controllers/RoleController.php
@@ -130,8 +130,8 @@ public function setActor(Request $request, $project_key, $id)
$add_user_ids = array_diff($new_user_ids, $old_user_ids);
$del_user_ids = array_diff($old_user_ids, $new_user_ids);
- Event::fire(new AddUserToRoleEvent($add_user_ids, $project_key));
- Event::fire(new DelUserFromRoleEvent($del_user_ids, $project_key));
+ Event::dispatch(new AddUserToRoleEvent($add_user_ids, $project_key));
+ Event::dispatch(new DelUserFromRoleEvent($del_user_ids, $project_key));
}
$data = Role::find($id);
@@ -162,8 +162,8 @@ public function setGroupActor(Request $request, $project_key, $id)
$add_group_ids = array_diff($new_group_ids, $old_group_ids);
$del_group_ids = array_diff($old_group_ids, $new_group_ids);
- Event::fire(new AddGroupToRoleEvent($add_group_ids, $project_key));
- Event::fire(new DelGroupFromRoleEvent($del_group_ids, $project_key));
+ Event::dispatch(new AddGroupToRoleEvent($add_group_ids, $project_key));
+ Event::dispatch(new DelGroupFromRoleEvent($del_group_ids, $project_key));
}
$data = Role::find($id);
@@ -248,9 +248,9 @@ public function destroy($project_key, $id)
if ($actor)
{
$user_ids = isset($actor->user_ids) ? $actor->user_ids : [];
- $user_ids && Event::fire(new DelUserFromRoleEvent($user_ids, $project_key));
+ $user_ids && Event::dispatch(new DelUserFromRoleEvent($user_ids, $project_key));
$group_ids = isset($actor->group_ids) ? $actor->group_ids : [];
- $group_ids && Event::fire(new DelGroupFromRoleEvent($group_ids, $project_key));
+ $group_ids && Event::dispatch(new DelGroupFromRoleEvent($group_ids, $project_key));
$actor->delete();
}
}
diff --git a/app/Http/Controllers/ScreenController.php b/app/Http/Controllers/ScreenController.php
old mode 100644
new mode 100755
index 5f0d2d9bf..821ad0f2c
--- a/app/Http/Controllers/ScreenController.php
+++ b/app/Http/Controllers/ScreenController.php
@@ -142,7 +142,7 @@ public function update(Request $request, $project_key, $id)
}
else
{
- $new_schema[] = Field::Find($field_id, ['name', 'key', 'type', 'defaultValue', 'optionValues'])->toArray();
+ $new_schema[] = Field::Find($field_id, ['name', 'key', 'type', 'defaultValue', 'optionValues', 'minValue', 'maxValue', 'maxLength'])->toArray();
}
}
$screen->schema = $new_schema;
diff --git a/app/Http/Controllers/SessionController.php b/app/Http/Controllers/SessionController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/SprintController.php b/app/Http/Controllers/SprintController.php
old mode 100644
new mode 100755
index 14ee000cb..9f2ea8dc1
--- a/app/Http/Controllers/SprintController.php
+++ b/app/Http/Controllers/SprintController.php
@@ -40,7 +40,13 @@ public function index($project_key)
public function store(Request $request, $project_key)
{
$sprint_count = Sprint::where('project_key', $project_key)->count();
- $sprint = Sprint::create([ 'project_key' => $project_key, 'no' => $sprint_count + 1, 'status' => 'waiting', 'issues' => [] ]);
+ $sprint = Sprint::create([
+ 'project_key' => $project_key,
+ 'no' => $sprint_count + 1,
+ 'name' => 'Sprint ' . ($sprint_count + 1),
+ 'status' => 'waiting',
+ 'issues' => []
+ ]);
return Response()->json(['ecode' => 0, 'data' => $this->getValidSprintList($project_key)]);
}
@@ -121,6 +127,11 @@ public function moveIssue(Request $request, $project_key)
public function show($project_key, $no)
{
$sprint = Sprint::where('project_key', $project_key)->where('no', intval($no))->first();
+ if (!$sprint->name)
+ {
+ $sprint->name = 'Sprint ' . $sprint->no;
+ }
+
return Response()->json(['ecode' => 0, 'data' => $sprint]);
}
@@ -186,6 +197,12 @@ public function publish(Request $request, $project_key, $no)
throw new \UnexpectedValueException('the sprint complete time cannot be empty.', -11710);
}
+ $name = $request->input('name');
+ if (isset($name) && $name)
+ {
+ $updValues['name'] = $name;
+ }
+
$description = $request->input('description');
if (isset($description) && $description)
{
@@ -212,7 +229,47 @@ public function publish(Request $request, $project_key, $no)
$isSendMsg = $request->input('isSendMsg') && true;
$user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new SprintEvent($project_key, $user, [ 'event_key' => 'start_sprint', 'isSendMsg' => $isSendMsg, 'data' => [ 'sprint_no' => $no ] ]));
+ Event::dispatch(new SprintEvent($project_key, $user, [ 'event_key' => 'start_sprint', 'isSendMsg' => $isSendMsg, 'data' => [ 'sprint_no' => $no ] ]));
+
+ return Response()->json([ 'ecode' => 0, 'data' => $this->getValidSprintList($project_key) ]);
+ }
+
+ /**
+ * edit the sprint.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function update(Request $request, $project_key, $no)
+ {
+ if (!$no)
+ {
+ throw new \UnexpectedValueException('the updated sprint cannot be empty', -11718);
+ }
+ $no = intval($no);
+
+ $sprint = Sprint::where('project_key', $project_key)->where('no', $no)->first();
+ if (!$sprint || $project_key != $sprint->project_key)
+ {
+ throw new \UnexpectedValueException('the sprint does not exist or is not in the project.', -11708);
+ }
+
+ $updValues = [];
+
+ $name = $request->input('name');
+ if (isset($name) && $name)
+ {
+ $updValues['name'] = $name;
+ }
+
+ $description = $request->input('description');
+ if (isset($description) && $description)
+ {
+ $updValues['description'] = $description;
+ }
+
+ $sprint->fill($updValues)->save();
return Response()->json([ 'ecode' => 0, 'data' => $this->getValidSprintList($project_key) ]);
}
@@ -262,7 +319,8 @@ public function complete(Request $request, $project_key, $no)
'status' => 'completed',
'real_complete_time' => time(),
'completed_issues' => $completed_issues,
- 'incompleted_issues' => $incompleted_issues ];
+ 'incompleted_issues' => $incompleted_issues
+ ];
$sprint->fill($updValues)->save();
@@ -279,7 +337,7 @@ public function complete(Request $request, $project_key, $no)
$isSendMsg = $request->input('isSendMsg') && true;
$user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new SprintEvent($project_key, $user, [ 'event_key' => 'complete_sprint', 'isSendMsg' => $isSendMsg, 'data' => [ 'sprint_no' => $no ] ]));
+ Event::dispatch(new SprintEvent($project_key, $user, [ 'event_key' => 'complete_sprint', 'isSendMsg' => $isSendMsg, 'data' => [ 'sprint_no' => $no ] ]));
return Response()->json([ 'ecode' => 0, 'data' => $this->getValidSprintList($project_key) ]);
}
@@ -339,6 +397,15 @@ public function getValidSprintList($project_key)
->whereIn('status', [ 'active', 'waiting' ])
->orderBy('no', 'asc')
->get();
+
+ foreach ($sprints as $sprint)
+ {
+ if (!$sprint->name)
+ {
+ $sprint->name = 'Sprint ' . $sprint->no;
+ }
+ }
+
return $sprints;
}
@@ -544,12 +611,19 @@ public function getLog(Request $request, $project_key, $sprint_no)
->orderBy('day', 'asc')
->get();
+ $today = date('Y/m/d');
$issue_count_remaining = [];
$story_points_remaining = [];
- $issue_count_remaining[] = [ 'day' => '', 'value' => $origin_issue_count ];
- $story_points_remaining[] = [ 'day' => '', 'value' => $origin_story_points ];
+ $issue_count_remaining[] = [ 'day' => '', 'value' => $origin_issue_count ];
+ $story_points_remaining[] = [ 'day' => '', 'value' => $origin_story_points ];
+
foreach($sprint_day_log as $daylog)
{
+ if ($daylog->day == $today)
+ {
+ continue;
+ }
+
$incompleted_issue_num = 0;
$incompleted_story_points = 0;
$issues = isset($daylog->issues) ? $daylog->issues : [];
@@ -564,7 +638,29 @@ public function getLog(Request $request, $project_key, $sprint_no)
$issue_count_remaining[] = [ 'day' => substr($daylog->day, 5), 'value' => $incompleted_issue_num, 'notWorking' => isset($workingDays[$daylog->day]) ? ($workingDays[$daylog->day] + 1) % 2 : 0 ];
$story_points_remaining[] = [ 'day' => substr($daylog->day, 5), 'value' => $incompleted_story_points, 'notWorking' => isset($workingDays[$daylog->day]) ? ($workingDays[$daylog->day] + 1) % 2 : 0 ];
}
- // remaining start
+
+ if ($sprint->complete_time > time())
+ {
+ $incompleted_issue_num = 0;
+ $incompleted_story_points = 0;
+
+ $issue_nos = isset($sprint->issues) ? $sprint->issues : [];
+ $issues = DB::collection('issue_' . $project_key)
+ ->where([ 'no' => [ '$in' => $issue_nos ] ])
+ ->get();
+ foreach ($issues as $issue)
+ {
+ $tmp_state = isset($issue['state']) ? $issue['state'] : '';
+ $tmp_story_points = isset($issue['story_points']) ? $issue['story_points'] : 0;
+ if (!in_array($tmp_state , $last_column_states))
+ {
+ $incompleted_issue_num++;
+ $incompleted_story_points += $tmp_story_points;
+ }
+ }
+ $issue_count_remaining[] = [ 'day' => substr($today, 5), 'value' => $incompleted_issue_num, 'notWorking' => isset($workingDays[$today]) ? ($workingDays[$today] + 1) % 2 : 0 ];
+ $story_points_remaining[] = [ 'day' => substr($today, 5), 'value' => $incompleted_story_points, 'notWorking' => isset($workingDays[$today]) ? ($workingDays[$today] + 1) % 2 : 0 ];
+ }
return Response()->json([ 'ecode' => 0, 'data' => [ 'issue_count' => [ 'guideline' => $issue_count_guideline, 'remaining' => $issue_count_remaining ], 'story_points' => [ 'guideline' => $story_points_guideline, 'remaining' => $story_points_remaining ] ] ]);
}
diff --git a/app/Http/Controllers/StateController.php b/app/Http/Controllers/StateController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/SummaryController.php b/app/Http/Controllers/SummaryController.php
old mode 100644
new mode 100755
index 1ced97f7e..e96f707a3
--- a/app/Http/Controllers/SummaryController.php
+++ b/app/Http/Controllers/SummaryController.php
@@ -24,11 +24,9 @@ public function getTopFourFilters($project_key)
{
$filters = Provider::getIssueFilters($project_key, $this->user->id);
$filters = array_slice($filters, 0, 4);
- foreach ($filters as $key => $filter)
- {
+ foreach ($filters as $key => $filter) {
$query = [];
- if (isset($filter['query']) && $filter['query'])
- {
+ if (isset($filter['query']) && $filter['query']) {
$query = $filter['query'];
}
@@ -56,10 +54,9 @@ public function getPulseData($project_key)
// initialize the pulse data
$t = strtotime('-2 week');
- while($t <= time())
- {
+ while ($t <= time()) {
$ymd = date('Y/m/d', $t);
- $trend[$ymd] = [ 'new' => 0, 'resolved' => 0, 'closed' => 0 ];
+ $trend[$ymd] = ['new' => 0, 'resolved' => 0, 'closed' => 0];
$t += 24 * 3600;
}
@@ -71,41 +68,33 @@ public function getPulseData($project_key)
->orWhere('closed_at', '>=', $twoWeeksAgo);
})
->where('del_flg', '<>', 1)
- ->get([ 'created_at', 'resolved_at', 'closed_at' ]);
+ ->get(['created_at', 'resolved_at', 'closed_at']);
- foreach ($issues as $issue)
- {
- if (isset($issue['created_at']) && $issue['created_at'])
- {
+ foreach ($issues as $issue) {
+ if (isset($issue['created_at']) && $issue['created_at']) {
$created_date = date('Y/m/d', $issue['created_at']);
- if (isset($trend[$created_date]))
- {
+ if (isset($trend[$created_date])) {
$trend[$created_date]['new'] += 1;
}
}
- if (isset($issue['resolved_at']) && $issue['resolved_at'])
- {
+ if (isset($issue['resolved_at']) && $issue['resolved_at']) {
$resolved_date = date('Y/m/d', $issue['resolved_at']);
- if (isset($trend[$resolved_date]))
- {
+ if (isset($trend[$resolved_date])) {
$trend[$resolved_date]['resolved'] += 1;
}
}
- if (isset($issue['closed_at']) && $issue['closed_at'])
- {
+ if (isset($issue['closed_at']) && $issue['closed_at']) {
$closed_date = date('Y/m/d', $issue['closed_at']);
- if (isset($trend[$closed_date]))
- {
+ if (isset($trend[$closed_date])) {
$trend[$closed_date]['closed'] += 1;
}
}
}
$new_trend = [];
- foreach ($trend as $key => $val)
- {
- $new_trend[] = [ 'day' => $key ] + $val;
+ foreach ($trend as $key => $val) {
+ $new_trend[] = ['day' => $key] + $val;
}
return $new_trend;
}
@@ -122,26 +111,21 @@ public function index($project_key)
// the two weeks issuepulse
$trend = $this->getPulseData($project_key);
- $types = Provider::getTypeList($project_key);
-
+ $types = Provider::getTypeList($project_key);
+
$optPriorities = [];
- $priorities = Provider::getPriorityList($project_key);
- foreach ($priorities as $priority)
- {
- if (isset($priority['key']))
- {
+ $priorities = Provider::getPriorityList($project_key);
+ foreach ($priorities as $priority) {
+ if (isset($priority['key'])) {
$optPriorities[$priority['key']] = $priority['name'];
- }
- else
- {
+ } else {
$optPriorities[$priority['_id']] = $priority['name'];
}
}
$optModules = [];
$modules = Provider::getModuleList($project_key);
- foreach ($modules as $module)
- {
+ foreach ($modules as $module) {
$optModules[$module->id] = $module->name;
}
@@ -150,13 +134,11 @@ public function index($project_key)
$issues = DB::collection('issue_' . $project_key)
->where('created_at', '>=', strtotime(date('Ymd', strtotime('-1 week'))))
->where('del_flg', '<>', 1)
- ->get([ 'type' ]);
+ ->get(['type']);
- $new_issues = [ 'total' => 0 ];
- foreach ($issues as $issue)
- {
- if (!isset($new_issues[$issue['type']]))
- {
+ $new_issues = ['total' => 0];
+ foreach ($issues as $issue) {
+ if (!isset($new_issues[$issue['type']])) {
$new_issues[$issue['type']] = 0;
}
$new_issues[$issue['type']] += 1;
@@ -167,13 +149,11 @@ public function index($project_key)
->where('state', 'Closed')
->where('updated_at', '>=', strtotime(date('Ymd', strtotime('-1 week'))))
->where('del_flg', '<>', 1)
- ->get([ 'type' ]);
+ ->get(['type']);
- $closed_issues = [ 'total' => 0 ];
- foreach ($issues as $issue)
- {
- if (!isset($closed_issues[$issue['type']]))
- {
+ $closed_issues = ['total' => 0];
+ foreach ($issues as $issue) {
+ if (!isset($closed_issues[$issue['type']])) {
$closed_issues[$issue['type']] = 0;
}
$closed_issues['total'] += 1;
@@ -181,44 +161,46 @@ public function index($project_key)
}
$new_percent = $closed_percent = 0;
- if ($new_issues['total'] > 0 || $closed_issues['total'] > 0)
- {
+ if ($new_issues['total'] > 0 || $closed_issues['total'] > 0) {
$new_percent = $new_issues['total'] * 100 / ($new_issues['total'] + $closed_issues['total']);
- if ($new_percent > 0 && $new_percent < 1)
- {
+ if ($new_percent > 0 && $new_percent < 1) {
$new_percent = 1;
- }
- else
- {
+ } else {
$new_percent = floor($new_percent);
}
$closed_percent = 100 - $new_percent;
}
-
+
$new_issues['percent'] = $new_percent;
$closed_issues['percent'] = $closed_percent;
$issues = DB::collection('issue_' . $project_key)
->where('resolution', 'Unresolved')
->where('del_flg', '<>', 1)
- ->get([ 'priority', 'assignee', 'type', 'module' ]);
+ ->get(['priority', 'assignee', 'type', 'module']);
$users = [];
$assignee_unresolved_issues = [];
- foreach ($issues as $issue)
- {
- if (!isset($issue['assignee']) || !$issue['assignee'])
- {
+ foreach ($issues as $issue) {
+ if (!isset($issue['assignee']) || !$issue['assignee']) {
continue;
}
+ if (is_array($issue['assignee']['id'])) {
+ if (!isset($issue['assignee']['id']['id'])) {
+ continue;
+ } else {
+ $issue['assignee']['id'] = $issue['assignee']['id']['id'];
+ }
+ }
+ // exit;
+
$users[$issue['assignee']['id']] = $issue['assignee']['name'];
- if (!isset($assignee_unresolved_issues[$issue['assignee']['id']][$issue['type']]))
- {
+ if(!isset($issue['type'])) $issue['type'] =0;
+ if (!isset($assignee_unresolved_issues[$issue['assignee']['id']][$issue['type']])) {
$assignee_unresolved_issues[$issue['assignee']['id']][$issue['type']] = 0;
}
- if (!isset($assignee_unresolved_issues[$issue['assignee']['id']]['total']))
- {
+ if (!isset($assignee_unresolved_issues[$issue['assignee']['id']]['total'])) {
$assignee_unresolved_issues[$issue['assignee']['id']]['total'] = 0;
}
$assignee_unresolved_issues[$issue['assignee']['id']][$issue['type']] += 1;
@@ -227,23 +209,18 @@ public function index($project_key)
$assignee_unresolved_issues = $this->calPercent($assignee_unresolved_issues);
$priority_unresolved_issues = [];
- foreach ($issues as $issue)
- {
- if (!isset($issue['priority']) || !$issue['priority'])
- {
+ foreach ($issues as $issue) {
+ if (!isset($issue['priority']) || !$issue['priority']) {
$priority_id = '-1';
- }
- else
- {
- $priority_id = isset($optPriorities[$issue['priority']]) ? $issue['priority'] : '-1';
+ } else {
+ $priority_id = isset($optPriorities[$issue['priority']]) ? $issue['priority'] : '-1';
}
- if (!isset($priority_unresolved_issues[$priority_id][$issue['type']]))
- {
+ if(!isset($issue['type'])) $issue['type'] =0;
+ if (!isset($priority_unresolved_issues[$priority_id][$issue['type']])) {
$priority_unresolved_issues[$priority_id][$issue['type']] = 0;
}
- if (!isset($priority_unresolved_issues[$priority_id]['total']))
- {
+ if (!isset($priority_unresolved_issues[$priority_id]['total'])) {
$priority_unresolved_issues[$priority_id]['total'] = 0;
}
$priority_unresolved_issues[$priority_id][$issue['type']] += 1;
@@ -251,10 +228,8 @@ public function index($project_key)
}
$sorted_priority_unresolved_issues = [];
- foreach ($optPriorities as $key => $val)
- {
- if (isset($priority_unresolved_issues[$key]))
- {
+ foreach ($optPriorities as $key => $val) {
+ if (isset($priority_unresolved_issues[$key])) {
$sorted_priority_unresolved_issues[$key] = $priority_unresolved_issues[$key];
}
}
@@ -265,35 +240,27 @@ public function index($project_key)
$sorted_priority_unresolved_issues = $this->calPercent($sorted_priority_unresolved_issues);
$module_unresolved_issues = [];
- foreach ($issues as $issue)
- {
+ foreach ($issues as $issue) {
$module_ids = [];
- if (!isset($issue['module']) || !$issue['module'])
- {
- $module_ids = [ '-1' ];
- }
- else
- {
+ if (!isset($issue['module']) || !$issue['module']) {
+ $module_ids = ['-1'];
+ } else {
$ms = is_string($issue['module']) ? explode(',', $issue['module']) : $issue['module'];
- foreach ($ms as $m)
- {
+ foreach ($ms as $m) {
$module_ids[] = isset($optModules[$m]) ? $m : '-1';
}
$module_ids = array_unique($module_ids);
}
- foreach ($module_ids as $module_id)
- {
- if (count($module_ids) > 1 && $module_id === '-1')
- {
+ foreach ($module_ids as $module_id) {
+ if (count($module_ids) > 1 && $module_id === '-1') {
continue;
}
- if (!isset($module_unresolved_issues[$module_id][$issue['type']]))
- {
+ if(!isset($issue['type'])) $issue['type'] =0;
+ if (!isset($module_unresolved_issues[$module_id][$issue['type']])) {
$module_unresolved_issues[$module_id][$issue['type']] = 0;
}
- if (!isset($module_unresolved_issues[$module_id]['total']))
- {
+ if (!isset($module_unresolved_issues[$module_id]['total'])) {
$module_unresolved_issues[$module_id]['total'] = 0;
}
$module_unresolved_issues[$module_id][$issue['type']] += 1;
@@ -302,10 +269,8 @@ public function index($project_key)
}
$sorted_module_unresolved_issues = [];
- foreach ($optModules as $key => $val)
- {
- if (isset($module_unresolved_issues[$key]))
- {
+ foreach ($optModules as $key => $val) {
+ if (isset($module_unresolved_issues[$key])) {
$sorted_module_unresolved_issues[$key] = $module_unresolved_issues[$key];
}
}
@@ -315,23 +280,24 @@ public function index($project_key)
$sorted_module_unresolved_issues = $this->calPercent($sorted_module_unresolved_issues);
- return Response()->json([
- 'ecode' => 0,
- 'data' => [
+ return Response()->json([
+ 'ecode' => 0,
+ 'data' => [
'filters' => $filters,
'trend' => $trend,
- 'new_issues' => $new_issues,
- 'closed_issues' => $closed_issues,
- 'assignee_unresolved_issues' => $assignee_unresolved_issues,
- 'priority_unresolved_issues' => $sorted_priority_unresolved_issues,
- 'module_unresolved_issues' => $sorted_module_unresolved_issues ],
- 'options' => [
- 'types' => $types,
- 'users' => $users,
- 'priorities' => $optPriorities,
- 'modules' => $optModules,
- 'twoWeeksAgo' => date('m/d', strtotime('-2 week'))
- ]
+ 'new_issues' => $new_issues,
+ 'closed_issues' => $closed_issues,
+ 'assignee_unresolved_issues' => $assignee_unresolved_issues,
+ 'priority_unresolved_issues' => $sorted_priority_unresolved_issues,
+ 'module_unresolved_issues' => $sorted_module_unresolved_issues
+ ],
+ 'options' => [
+ 'types' => $types,
+ 'users' => $users,
+ 'priorities' => $optPriorities,
+ 'modules' => $optModules,
+ 'twoWeeksAgo' => date('m/d', strtotime('-2 week'))
+ ]
]);
}
@@ -342,46 +308,37 @@ function calPercent($arr)
$quotients = [];
$remainders = [];
- foreach ($arr as $key => $val)
- {
+ foreach ($arr as $key => $val) {
$counts[$key] = isset($val['total']) && $val['total'] ? $val['total'] : 0;
$total += $counts[$key];
}
- foreach ($counts as $key => $count)
- {
+ foreach ($counts as $key => $count) {
$quotient = $count * 100 / $total;
- if ($quotient > 0 && $quotient <= 1)
- {
+ if ($quotient > 0 && $quotient <= 1) {
$quotients[$key] = 1;
- }
- else
- {
+ } else {
$quotients[$key] = floor($quotient);
}
$remainders[$key] = ($count * 100) % $total;
}
$sum = array_sum($quotients);
- if ($sum < 100)
- {
+ if ($sum < 100) {
$less = 100 - $sum;
arsort($remainders);
$i = 1;
- foreach ($remainders as $key => $remainder)
- {
+ foreach ($remainders as $key => $remainder) {
$quotients[$key] += 1;
- if ($i >= $less)
- {
+ if ($i >= $less) {
break;
}
$i++;
}
}
- foreach ($arr as $key => $val)
- {
+ foreach ($arr as $key => $val) {
$arr[$key]['percent'] = $quotients[$key];
}
return $arr;
diff --git a/app/Http/Controllers/SyssettingController.php b/app/Http/Controllers/SyssettingController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/TimeTrackTrait.php b/app/Http/Controllers/TimeTrackTrait.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/TypeController.php b/app/Http/Controllers/TypeController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php
old mode 100644
new mode 100755
index 50f22318e..29addd4a9
--- a/app/Http/Controllers/UserController.php
+++ b/app/Http/Controllers/UserController.php
@@ -28,10 +28,44 @@ class UserController extends Controller
public function __construct()
{
- $this->middleware('privilege:sys_admin', [ 'except' => [ 'register', 'search', 'show', 'sendMailForResetpwd', 'showResetpwd', 'doResetpwd' ] ]);
+ $this->middleware('privilege:sys_admin', [ 'except' => [ 'login', 'register', 'search', 'show', 'sendMailForResetpwd', 'showResetpwd', 'doResetpwd' ] ]);
parent::__construct();
}
+ /**
+ * user login.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function login(Request $request)
+ {
+ $email = $request->input('email');
+ $password = $request->input('password');
+ if (!$email || !$password)
+ {
+ throw new \UnexpectedValueException('email or password cannot be empty.', -10003);
+ }
+
+ if (strpos($email, '@') === false)
+ {
+ $setting = SysSetting::first();
+ if ($setting && isset($setting->properties) && isset($setting->properties['login_mail_domain']))
+ {
+ $email = $email . '@' . $setting->properties['login_mail_domain'];
+ }
+ }
+
+ $user = Sentinel::authenticate([ 'email' => $email, 'password' => $password ]);
+ if ($user)
+ {
+ return Response()->json([ 'ecode' => 0, 'data' => $user ]);
+ }
+ else
+ {
+ return Response()->json([ 'ecode' => -10000, 'data' => [] ]);
+ }
+ }
+
/**
* Display a listing of the resource.
*
@@ -320,6 +354,8 @@ public function update(Request $request, $id)
$user = Sentinel::update($user, array_only($request->all(), ['first_name', 'email', 'phone', 'invalid_flag']));
$user->status = $user->invalid_flag === 1 ? 'invalid' : (Activation::completed($user) ? 'active' : 'unactivated');
+ $user->groups = array_column(Group::whereRaw([ 'users' => $user->id ])->get([ 'name' ])->toArray() ?: [], 'name');
+
return Response()->json([ 'ecode' => 0, 'data' => $user ]);
}
@@ -342,7 +378,7 @@ public function destroy($id)
}
$user->delete();
- Event::fire(new DelUserEvent($id));
+ Event::dispatch(new DelUserEvent($id));
return Response()->json([ 'ecode' => 0, 'data' => [ 'id' => $id ] ]);
}
@@ -371,7 +407,7 @@ public function delMultiUsers(Request $request)
}
$user->delete();
- Event::fire(new DelUserEvent($id));
+ Event::dispatch(new DelUserEvent($id));
$deleted_ids[] = $id;
}
}
@@ -496,7 +532,7 @@ public function sendMailForResetpwd(Request $request)
$data['email'] = $email;
$rand_code = md5($email . mt_rand() . microtime());
$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
- $data['url'] = $http_type . $_SERVER['HTTP_HOST'] . '/resetpwd?code=' . $rand_code;
+ $data['url'] = $http_type . $_SERVER['HTTP_HOST'] . '/actionview/resetpwd?code=' . $rand_code;
$this->sendMail($sendto_email, $data);
diff --git a/app/Http/Controllers/VersionController.php b/app/Http/Controllers/VersionController.php
old mode 100644
new mode 100755
index e9dc323c1..830d6b919
--- a/app/Http/Controllers/VersionController.php
+++ b/app/Http/Controllers/VersionController.php
@@ -33,7 +33,7 @@ public function index(Request $request, $project_key)
$query = Version::where('project_key', $project_key);
$total = $query->count();
- $query = $query->orderBy('status', 'asc')
+ $query = $query->orderBy('status', 'desc')
->orderBy('released_time', 'desc')
->orderBy('end_time', 'desc')
->orderBy('created_at', 'desc');
@@ -116,7 +116,7 @@ public function store(Request $request, $project_key)
$version = Version::create([ 'project_key' => $project_key, 'creator' => $creator, 'status' => 'unreleased' ] + $request->all());
// trigger event of version added
- Event::fire(new VersionEvent($project_key, $creator, [ 'event_key' => 'create_version', 'data' => $version->toArray() ]));
+ Event::dispatch(new VersionEvent($project_key, $creator, [ 'event_key' => 'create_version', 'data' => $version->toArray() ]));
return Response()->json([ 'ecode' => 0, 'data' => $version ]);
}
@@ -203,7 +203,7 @@ public function release(Request $request, $project_key, $id)
{
$isSendMsg = $request->input('isSendMsg') && true;
$cur_user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new VersionEvent($project_key, $cur_user, [ 'event_key' => 'release_version', 'isSendMsg' => $isSendMsg, 'data' => Version::find($id)->toArray() ]));
+ Event::dispatch(new VersionEvent($project_key, $cur_user, [ 'event_key' => 'release_version', 'isSendMsg' => $isSendMsg, 'data' => Version::find($id)->toArray() ]));
}
return $this->show($project_key, $id);
@@ -257,7 +257,7 @@ public function update(Request $request, $project_key, $id)
$version->fill($updValues)->save();
- Event::fire(new VersionEvent($project_key, $updValues['modifier'], [ 'event_key' => 'edit_version', 'data' => Version::find($id)->toArray() ]));
+ Event::dispatch(new VersionEvent($project_key, $updValues['modifier'], [ 'event_key' => 'edit_version', 'data' => Version::find($id)->toArray() ]));
return $this->show($project_key, $id);
}
@@ -300,7 +300,7 @@ public function merge(Request $request, $project_key)
// trigger event of version edited
$cur_user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new VersionEvent($project_key, $cur_user, [ 'event_key' => 'merge_version', 'data' => [ 'source' => $source_version->toArray(), 'dest' => $dest_version->toArray() ] ]));
+ Event::dispatch(new VersionEvent($project_key, $cur_user, [ 'event_key' => 'merge_version', 'data' => [ 'source' => $source_version->toArray(), 'dest' => $dest_version->toArray() ] ]));
return $this->show($project_key, $dest);
}
@@ -316,7 +316,8 @@ public function merge(Request $request, $project_key)
public function updIssueResolveVersion($project_key, $source, $dest)
{
$issues = DB::collection('issue_' . $project_key)
- ->where('resolve_version', 'Unresolved')
+ ->where('resolution', 'Unresolved')
+ ->where('resolve_version', $source)
->where('del_flg', '<>', 1)
->get();
foreach ($issues as $issue)
@@ -331,7 +332,7 @@ public function updIssueResolveVersion($project_key, $source, $dest)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $issue_id, [], [ 'resolve_version' ]);
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
}
}
@@ -391,7 +392,7 @@ public function updIssueVersion($project_key, $source, $dest)
// add to histroy table
$snap_id = Provider::snap2His($project_key, $issue_id, [], $updFields);
// trigger event of issue edited
- Event::fire(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'edit_issue', 'snap_id' => $snap_id ]));
}
}
}
@@ -451,7 +452,7 @@ public function delete(Request $request, $project_key, $id)
// trigger event of version edited
$cur_user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new VersionEvent($project_key, $cur_user, [ 'event_key' => 'del_version', 'data' => $version->toArray() ]));
+ Event::dispatch(new VersionEvent($project_key, $cur_user, [ 'event_key' => 'del_version', 'data' => $version->toArray() ]));
if ($operate_flg === '1')
{
diff --git a/app/Http/Controllers/WebhookController.php b/app/Http/Controllers/WebhookController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/WebhooksController.php b/app/Http/Controllers/WebhooksController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/WikiController.php b/app/Http/Controllers/WikiController.php
old mode 100644
new mode 100755
index 0fa55e831..ae341b85c
--- a/app/Http/Controllers/WikiController.php
+++ b/app/Http/Controllers/WikiController.php
@@ -3,13 +3,18 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
+use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Event;
use App\Http\Requests;
+
use App\Http\Controllers\Controller;
use App\Events\WikiEvent;
+use App\Project\Eloquent\WikiFavorites;
use App\Utils\File;
+use App\Models\Files as FilesModel;
use DB;
+use MongoDB\BSON\ObjectID;
use Zipper;
class WikiController extends Controller
@@ -23,14 +28,12 @@ class WikiController extends Controller
public function searchPath(Request $request, $project_key)
{
$s = $request->input('s');
- if (!$s)
- {
+ if (!$s) {
return Response()->json(['ecode' => 0, 'data' => []]);
}
- if ($s === '/')
- {
- return Response()->json(['ecode' => 0, 'data' => [ [ 'id' => '0', 'name' => '/' ] ] ]);
+ if ($s === '/') {
+ return Response()->json(['ecode' => 0, 'data' => [['id' => '0', 'name' => '/']]]);
}
$query = DB::collection('wiki_' . $project_key)
@@ -39,8 +42,7 @@ public function searchPath(Request $request, $project_key)
->where('name', 'like', '%' . $s . '%');
$moved_path = $request->input('moved_path');
- if (isset($moved_path) && $moved_path)
- {
+ if (isset($moved_path) && $moved_path) {
$query->where('pt', '<>', $moved_path);
$query->where('_id', '<>', $moved_path);
}
@@ -48,31 +50,130 @@ public function searchPath(Request $request, $project_key)
$directories = $query->take(20)->get(['name', 'pt']);
$ret = [];
- foreach ($directories as $d)
- {
+ foreach ($directories as $d) {
$parents = [];
$path = '';
$ps = DB::collection('wiki_' . $project_key)
->whereIn('_id', $d['pt'])
- ->get([ 'name' ]);
- foreach ($ps as $val)
- {
+ ->get(['name']);
+ foreach ($ps as $val) {
$parents[$val['_id']->__toString()] = $val['name'];
}
- foreach ($d['pt'] as $pid)
- {
- if (isset($parents[$pid]))
- {
+ foreach ($d['pt'] as $pid) {
+ if (isset($parents[$pid])) {
$path .= '/' . $parents[$pid];
}
}
$path .= '/' . $d['name'];
- $ret[] = [ 'id' => $d['_id']->__toString(), 'name' => $path ];
+ $ret[] = ['id' => $d['_id']->__toString(), 'name' => $path];
}
return Response()->json(['ecode' => 0, 'data' => parent::arrange($ret)]);
}
+ /**
+ * get the directory children.
+ * @param string $project_key
+ * @param string $directory
+ * @return \Illuminate\Http\Response
+ */
+ public function getDirChildren(Request $request, $project_key, $directory)
+ {
+ $sub_dirs = DB::collection('wiki_' . $project_key)
+ ->where('parent', $directory)
+ ->where('del_flag', '<>', 1)
+ ->get();
+
+ $res = [];
+ foreach ($sub_dirs as $val) {
+ $res[] = [
+ 'id' => $val['_id']->__toString(),
+ 'name' => $val['name'],
+ 'd' => isset($val['d']) ? $val['d'] : 0,
+ 'parent' => isset($val['parent']) ? $val['parent'] : ''
+ ];
+ }
+
+ return Response()->json(['ecode' => 0, 'data' => $res]);
+ }
+
+ /**
+ * get the directory tree.
+ * @param string $project_key
+ * @return \Illuminate\Http\Response
+ */
+ public function getDirTree(Request $request, $project_key)
+ {
+ $dt = ['id' => '0', 'name' => '根目录', 'd' => 1];
+
+ $curnode = $request->input('currentnode');
+ if (!$curnode) {
+ $curnode = '0';
+ }
+
+ $pt = ['0'];
+ if ($curnode !== '0') {
+ $node = DB::collection('wiki_' . $project_key)
+ ->where('_id', $curnode)
+ ->first();
+
+ if ($node) {
+ $pt = $node['pt'];
+ if (isset($node['d']) && $node['d'] == 1) {
+ array_push($pt, $curnode);
+ }
+ }
+ }
+
+ foreach ($pt as $val) {
+ $sub_dirs = DB::collection('wiki_' . $project_key)
+ ->where('parent', $val)
+ ->where('del_flag', '<>', 1)
+ ->get();
+
+ $this->addChildren2Tree($dt, $val, $sub_dirs);
+ }
+
+ return Response()->json(['ecode' => 0, 'data' => $dt]);
+ }
+
+ /**
+ * add children to tree.
+ *
+ * @param array $dt
+ * @param string $parent_id
+ * @param array $sub_dirs
+ * @return void
+ */
+ public function addChildren2Tree(&$dt, $parent_id, $sub_dirs)
+ {
+ $new_dirs = [];
+ foreach ($sub_dirs as $val) {
+ $new_dirs[] = [
+ 'id' => $val['_id']->__toString(),
+ 'name' => $val['name'],
+ 'd' => isset($val['d']) ? $val['d'] : 0,
+ 'parent' => isset($val['parent']) ? $val['parent'] : ''
+ ];
+ }
+
+ if ($dt['id'] == $parent_id) {
+ $dt['children'] = $new_dirs;
+ return true;
+ } else {
+ if (isset($dt['children']) && $dt['children']) {
+ $children_num = count($dt['children']);
+ for ($i = 0; $i < $children_num; $i++) {
+ $res = $this->addChildren2Tree($dt['children'][$i], $parent_id, $sub_dirs);
+ if ($res === true) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+
/**
* Display a listing of the resource.
*
@@ -85,18 +186,22 @@ public function index(Request $request, $project_key, $directory)
$query = DB::collection('wiki_' . $project_key);
$name = $request->input('name');
- if (isset($name) && $name)
- {
+ if (isset($name) && $name) {
$mode = 'search';
$query = $query->where('name', 'like', '%' . $name . '%');
}
+ $contents = $request->input('contents');
+ if (isset($contents) && $contents) {
+ $mode = 'search';
+ $query = $query->where('contents', 'like', '%' . $contents . '%');
+ }
+
$updated_at = $request->input('updated_at');
- if (isset($updated_at) && $updated_at)
- {
+ if (isset($updated_at) && $updated_at) {
$mode = 'search';
$query->where(function ($query) use ($updated_at) {
- $unitMap = [ 'w' => 'week', 'm' => 'month', 'y' => 'year' ];
+ $unitMap = ['w' => 'week', 'm' => 'month', 'y' => 'year'];
$unit = substr($updated_at, -1);
$val = abs(substr($updated_at, 0, -1));
$query->where('created_at', '>=', strtotime(date('Ymd', strtotime('-' . $val . ' ' . $unitMap[$unit]))))
@@ -104,14 +209,27 @@ public function index(Request $request, $project_key, $directory)
});
}
- if ($directory !== '0')
- {
- $query = $query->where($mode === 'search' ? 'pt' : 'parent', $directory);
+ $favorite_wikis = WikiFavorites::where('project_key', $project_key)
+ ->where('user.id', $this->user->id)
+ ->get()
+ ->toArray();
+ $favorite_dids = array_column($favorite_wikis, 'wid');
+
+ $myfavorite = $request->input('myfavorite');
+ if (isset($myfavorite) && $myfavorite == '1') {
+ $mode = 'search';
+ $favoritedIds = [];
+ foreach ($favorite_dids as $did) {
+ $favoritedIds[] = new ObjectID($did);
+ }
+
+ $query->whereIn('_id', $favoritedIds);
}
- else
- {
- if ($mode === 'list')
- {
+
+ if ($directory !== '0') {
+ $query = $query->where($mode === 'search' ? 'pt' : 'parent', $directory);
+ } else {
+ if ($mode === 'list') {
$query = $query->where('parent', $directory);
}
}
@@ -123,35 +241,40 @@ public function index(Request $request, $project_key, $directory)
$query->take($limit);
$documents = $query->get();
+ $favorite_wikis = WikiFavorites::where('project_key', $project_key)
+ ->where('user.id', $this->user->id)
+ ->get()
+ ->toArray();
+ $favorite_wids = array_column($favorite_wikis, 'wid');
+
+ foreach ($documents as $k => $d) {
+ if (in_array($d['_id']->__toString(), $favorite_wids)) {
+ $documents[$k]['favorited'] = true;
+ }
+ }
+
$path = [];
$home = [];
- if ($directory === '0')
- {
- $path[] = [ 'id' => '0', 'name' => 'root' ];
- if ($mode === 'list')
- {
- foreach ($documents as $doc)
- {
- if ((!isset($doc['d']) || $doc['d'] != 1) && strtolower($doc['name']) === 'home')
- {
+ if ($directory === '0') {
+ $path[] = ['id' => '0', 'name' => 'root'];
+ if ($mode === 'list') {
+ foreach ($documents as $doc) {
+ if ((!isset($doc['d']) || $doc['d'] != 1) && strtolower($doc['name']) === 'home') {
$home = $doc;
}
}
}
- }
- else
- {
+ } else {
$d = DB::collection('wiki_' . $project_key)
->where('_id', $directory)
->first();
- if ($d && isset($d['pt']))
- {
+ if ($d && isset($d['pt'])) {
$path = $this->getPathTreeDetail($project_key, $d['pt']);
}
- $path[] = [ 'id' => $directory, 'name' => $d['name'] ];
+ $path[] = ['id' => $directory, 'name' => $d['name']];
}
- return Response()->json([ 'ecode' => 0, 'data' => parent::arrange($documents), 'options' => [ 'path' => $path, 'home' => parent::arrange($home) ] ]);
+ return Response()->json(['ecode' => 0, 'data' => parent::arrange($documents), 'options' => ['path' => $path, 'home' => parent::arrange($home)]]);
}
/**
@@ -164,16 +287,12 @@ public function index(Request $request, $project_key, $directory)
public function create(Request $request, $project_key)
{
$d = $request->input('d');
- if (isset($d) && $d == 1)
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project'))
- {
+ if (isset($d) && $d == 1) {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
return $this->createFolder($request, $project_key);
- }
- else
- {
+ } else {
return $this->createDoc($request, $project_key);
}
}
@@ -190,28 +309,24 @@ public function createDoc(Request $request, $project_key)
$insValues = [];
$parent = $request->input('parent');
- if (!isset($parent))
- {
+ if (!isset($parent)) {
throw new \UnexpectedValueException('the parent directory can not be empty.', -11950);
}
$insValues['parent'] = $parent;
- if ($parent !== '0')
- {
+ if ($parent !== '0') {
$isExists = DB::collection('wiki_' . $project_key)
->where('_id', $parent)
->where('d', 1)
->where('del_flag', '<>', 1)
->exists();
- if (!$isExists)
- {
+ if (!$isExists) {
throw new \UnexpectedValueException('the parent directory does not exist.', -11951);
}
}
$name = $request->input('name');
- if (!isset($name) || !$name)
- {
+ if (!isset($name) || !$name) {
throw new \UnexpectedValueException('the name can not be empty.', -11952);
}
$insValues['name'] = $name;
@@ -222,25 +337,23 @@ public function createDoc(Request $request, $project_key)
->where('d', '<>', 1)
->where('del_flag', '<>', 1)
->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11953);
}
$contents = $request->input('contents');
- if (isset($contents) && $contents)
- {
+ if (isset($contents) && $contents) {
$insValues['contents'] = $contents;
}
$insValues['pt'] = $this->getPathTree($project_key, $parent);
$insValues['version'] = 1;
- $insValues['creator'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $insValues['creator'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$insValues['created_at'] = time();
$id = DB::collection('wiki_' . $project_key)->insertGetId($insValues);
$isSendMsg = $request->input('isSendMsg') && true;
- Event::fire(new WikiEvent($project_key, $insValues['creator'], [ 'event_key' => 'create_wiki', 'isSendMsg' => $isSendMsg, 'data' => [ 'wiki_id' => $id->__toString() ] ]));
+ Event::dispatch(new WikiEvent($project_key, $insValues['creator'], ['event_key' => 'create_wiki', 'isSendMsg' => $isSendMsg, 'data' => ['wiki_id' => $id->__toString()]]));
return $this->show($request, $project_key, $id);
}
@@ -257,28 +370,24 @@ public function createFolder(Request $request, $project_key)
$insValues = [];
$parent = $request->input('parent');
- if (!isset($parent))
- {
+ if (!isset($parent)) {
throw new \UnexpectedValueException('the parent directory can not be empty.', -11950);
}
$insValues['parent'] = $parent;
- if ($parent !== '0')
- {
+ if ($parent !== '0') {
$isExists = DB::collection('wiki_' . $project_key)
->where('_id', $parent)
->where('d', 1)
->where('del_flag', '<>', 1)
->exists();
- if (!$isExists)
- {
+ if (!$isExists) {
throw new \UnexpectedValueException('the parent directory does not exist.', -11951);
}
}
$name = $request->input('name');
- if (!isset($name) || !$name)
- {
+ if (!isset($name) || !$name) {
throw new \UnexpectedValueException('the name can not be empty.', -11952);
}
$insValues['name'] = $name;
@@ -289,14 +398,13 @@ public function createFolder(Request $request, $project_key)
->where('d', 1)
->where('del_flag', '<>', 1)
->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11953);
}
$insValues['pt'] = $this->getPathTree($project_key, $parent);
$insValues['d'] = 1;
- $insValues['creator'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $insValues['creator'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$insValues['created_at'] = time();
$id = DB::collection('wiki_' . $project_key)->insertGetId($insValues);
@@ -317,18 +425,16 @@ public function checkin(Request $request, $project_key, $id)
->where('_id', $id)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- if (isset($document['checkin']) && $document['checkin'])
- {
+ if (isset($document['checkin']) && $document['checkin']) {
throw new \UnexpectedValueException('the object has been locked.', -11955);
}
- $checkin = [];
- $checkin['user'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $checkin = [];
+ $checkin['user'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$checkin['at'] = time();
DB::collection('wiki_' . $project_key)->where('_id', $id)->update(['checkin' => $checkin]);
@@ -348,13 +454,11 @@ public function checkout(Request $request, $project_key, $id)
->where('_id', $id)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- if (isset($document['checkin']) && !((isset($document['checkin']['user']) && $document['checkin']['user']['id'] == $this->user->id) || $this->isPermissionAllowed($project_key, 'manage_project')))
- {
+ if (isset($document['checkin']) && !((isset($document['checkin']['user']) && $document['checkin']['user']['id'] == $this->user->id) || $this->isPermissionAllowed($project_key, 'manage_project'))) {
throw new \UnexpectedValueException('the object cannot been unlocked.', -11956);
}
@@ -374,22 +478,17 @@ public function getPathTreeDetail($project_key, $pt)
$parents = [];
$ps = DB::collection('wiki_' . $project_key)
->whereIn('_id', $pt)
- ->get([ 'name' ]);
- foreach ($ps as $val)
- {
+ ->get(['name']);
+ foreach ($ps as $val) {
$parents[$val['_id']->__toString()] = $val['name'];
}
$path = [];
- foreach ($pt as $pid)
- {
- if ($pid === '0')
- {
- $path[] = [ 'id' => '0', 'name' => 'root' ];
- }
- else if (isset($parents[$pid]))
- {
- $path[] = [ 'id' => $pid, 'name' => $parents[$pid] ];
+ foreach ($pt as $pid) {
+ if ($pid === '0') {
+ $path[] = ['id' => '0', 'name' => 'root'];
+ } else if (isset($parents[$pid])) {
+ $path[] = ['id' => $pid, 'name' => $parents[$pid]];
}
}
return $path;
@@ -404,16 +503,13 @@ public function getPathTreeDetail($project_key, $pt)
public function getPathTree($project_key, $directory)
{
$pt = [];
- if ($directory === '0')
- {
- $pt = [ '0' ];
- }
- else
- {
+ if ($directory === '0') {
+ $pt = ['0'];
+ } else {
$d = DB::collection('wiki_' . $project_key)
->where('_id', $directory)
->first();
- $pt = array_merge($d['pt'], [ $directory ]);
+ $pt = array_merge($d['pt'], [$directory]);
}
return $pt;
}
@@ -432,11 +528,14 @@ public function show(Request $request, $project_key, $id)
->where('_id', $id)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
+ if (WikiFavorites::where('wid', $id)->where('user.id', $this->user->id)->exists()) {
+ $document['favorited'] = true;
+ }
+
$newest = [];
$newest['name'] = $document['name'];
$newest['editor'] = isset($document['editor']) ? $document['editor'] : $document['creator'];
@@ -444,14 +543,12 @@ public function show(Request $request, $project_key, $id)
$newest['version'] = $document['version'];
$v = $request->input('v');
- if (isset($v) && intval($v) != $document['version'])
- {
+ if (isset($v) && intval($v) != $document['version']) {
$w = DB::collection('wiki_version_' . $project_key)
->where('wid', $id)
- ->where('version', intval($v))
+ ->where('version', intval($v))
->first();
- if (!$w)
- {
+ if (!$w) {
throw new \UnexpectedValueException('the version does not exist.', -11957);
}
@@ -461,16 +558,19 @@ public function show(Request $request, $project_key, $id)
$document['updated_at'] = $w['updated_at'];
$document['version'] = $w['version'];
}
-
+
$document['versions'] = DB::collection('wiki_version_' . $project_key)
->where('wid', $id)
->orderBy('_id', 'desc')
->get(['name', 'editor', 'updated_at', 'version']);
- array_unshift($document['versions'], $newest);
+ $document['versions'] = $this->arr_fix($document['versions']);
+
+ if ($document['versions']) array_unshift($document['versions'], $newest);
+ else $document['versions'] = $newest;
$path = $this->getPathTreeDetail($project_key, $document['pt']);
- return Response()->json(['ecode' => 0, 'data' => parent::arrange($document), 'options' => [ 'path' => $path ]]);
+ return Response()->json(['ecode' => 0, 'data' => parent::arrange($document), 'options' => ['path' => $path]]);
}
/**
@@ -484,8 +584,7 @@ public function show(Request $request, $project_key, $id)
public function update(Request $request, $project_key, $id)
{
$name = $request->input('name');
- if (!isset($name) || !$name)
- {
+ if (!isset($name) || !$name) {
throw new \UnexpectedValueException('the name can not be empty.', -11952);
}
@@ -493,89 +592,70 @@ public function update(Request $request, $project_key, $id)
->where('_id', $id)
->where('del_flag', '<>', 1)
->first();
- if (!$old_document)
- {
+ if (!$old_document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- if (isset($old_document['d']) && $old_document['d'] === 1)
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project'))
- {
+ if (isset($old_document['d']) && $old_document['d'] === 1) {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
- }
- else
- {
- if (isset($old_document['checkin']) && isset($old_document['checkin']['user']) && $old_document['checkin']['user']['id'] !== $this->user->id)
- {
+ } else {
+ if (isset($old_document['checkin']) && isset($old_document['checkin']['user']) && $old_document['checkin']['user']['id'] !== $this->user->id) {
throw new \UnexpectedValueException('the object has been locked.', -11955);
}
}
$updValues = [];
- if ($old_document['name'] !== $name)
- {
+ if ($old_document['name'] !== $name) {
$query = DB::collection('wiki_' . $project_key)
->where('parent', $old_document['parent'])
->where('name', $name)
->where('del_flag', '<>', 1);
- if (isset($old_document['d']) && $old_document['d'] === 1)
- {
+ if (isset($old_document['d']) && $old_document['d'] === 1) {
$query->where('d', 1);
- }
- else
- {
+ } else {
$query->where('d', '<>', 1);
}
$isExists = $query->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11953);
}
$updValues['name'] = $name;
}
- if (!isset($old_document['d']) || $old_document['d'] !== 1)
- {
+ if (!isset($old_document['d']) || $old_document['d'] !== 1) {
$contents = $request->input('contents');
- if (isset($contents) && $contents)
- {
+ if (isset($contents) && $contents) {
$updValues['contents'] = $contents;
}
- if (isset($old_document['version']) && $old_document['version'])
- {
+ if (isset($old_document['version']) && $old_document['version']) {
$updValues['version'] = $old_document['version'] + 1;
- }
- else
- {
+ } else {
$updValues['version'] = 2;
}
}
-
- $updValues['editor'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+
+ $updValues['editor'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$updValues['updated_at'] = time();
DB::collection('wiki_' . $project_key)->where('_id', $id)->update($updValues);
// record the version
- if (!isset($old_document['d']) || $old_document['d'] !== 1)
- {
+ if (!isset($old_document['d']) || $old_document['d'] !== 1) {
// unlock the wiki
- DB::collection('wiki_' . $project_key)->where('_id', $id)->unset('checkin');
+ DB::collection('wiki_' . $project_key)->where('_id', $id)->unset('checkin');
// record versions
$this->recordVersion($project_key, $old_document);
$isSendMsg = $request->input('isSendMsg') && true;
- Event::fire(new WikiEvent($project_key, $updValues['editor'], [ 'event_key' => 'edit_wiki', 'isSendMsg' => $isSendMsg, 'data' => [ 'wiki_id' => $id ] ]));
+ Event::dispatch(new WikiEvent($project_key, $updValues['editor'], ['event_key' => 'edit_wiki', 'isSendMsg' => $isSendMsg, 'data' => ['wiki_id' => $id]]));
return $this->show($request, $project_key, $id);
- }
- else
- {
+ } else {
$document = DB::collection('wiki_' . $project_key)->where('_id', $id)->first();
return Response()->json(['ecode' => 0, 'data' => parent::arrange($document)]);
}
@@ -610,20 +690,17 @@ public function recordVersion($project_key, $document)
public function copy(Request $request, $project_key)
{
$id = $request->input('id');
- if (!isset($id) || !$id)
- {
+ if (!isset($id) || !$id) {
throw new \UnexpectedValueException('the copy object can not be empty.', -11960);
}
$name = $request->input('name');
- if (!isset($name) || !$name)
- {
+ if (!isset($name) || !$name) {
throw new \UnexpectedValueException('the name can not be empty.', -11952);
}
$dest_path = $request->input('dest_path');
- if (!isset($dest_path))
- {
+ if (!isset($dest_path)) {
throw new \UnexpectedValueException('the dest directory can not be empty.', -11961);
}
@@ -632,21 +709,18 @@ public function copy(Request $request, $project_key)
->where('d', '<>', 1)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the copy object does not exist.', -11962);
}
$dest_directory = [];
- if ($dest_path !== '0')
- {
+ if ($dest_path !== '0') {
$dest_directory = DB::collection('wiki_' . $project_key)
->where('_id', $dest_path)
->where('d', 1)
->where('del_flag', '<>', 1)
->first();
- if (!$dest_directory)
- {
+ if (!$dest_directory) {
throw new \UnexpectedValueException('the dest directory does not exist.', -11963);
}
}
@@ -657,8 +731,7 @@ public function copy(Request $request, $project_key)
->where('d', '<>', 1)
->where('del_flag', '<>', 1)
->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11953);
}
@@ -674,11 +747,11 @@ public function copy(Request $request, $project_key)
$insValues['version'] = 1;
$insValues['contents'] = isset($document['contents']) ? $document['contents'] : '';
$insValues['attachments'] = isset($document['attachments']) ? $document['attachments'] : [];
-
- $insValues['creator'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+
+ $insValues['creator'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$insValues['created_at'] = time();
- $new_id = DB::collection('wiki_' . $project_key)->insertGetId($insValues);
+ $new_id = DB::collection('wiki_' . $project_key)->insertGetId($insValues);
$document = DB::collection('wiki_' . $project_key)->where('_id', $new_id)->first();
return Response()->json(['ecode' => 0, 'data' => parent::arrange($document)]);
@@ -694,14 +767,12 @@ public function copy(Request $request, $project_key)
public function move(Request $request, $project_key)
{
$id = $request->input('id');
- if (!isset($id) || !$id)
- {
+ if (!isset($id) || !$id) {
throw new \UnexpectedValueException('the move object can not be empty.', -11964);
}
$dest_path = $request->input('dest_path');
- if (!isset($dest_path))
- {
+ if (!isset($dest_path)) {
throw new \UnexpectedValueException('the dest directory can not be empty.', -11965);
}
@@ -709,29 +780,24 @@ public function move(Request $request, $project_key)
->where('_id', $id)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the move object does not exist.', -11966);
}
- if (isset($document['d']) && $document['d'] === 1)
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project'))
- {
+ if (isset($document['d']) && $document['d'] === 1) {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
}
$dest_directory = [];
- if ($dest_path !== '0')
- {
+ if ($dest_path !== '0') {
$dest_directory = DB::collection('wiki_' . $project_key)
->where('_id', $dest_path)
->where('d', 1)
->where('del_flag', '<>', 1)
->first();
- if (!$dest_directory)
- {
+ if (!$dest_directory) {
throw new \UnexpectedValueException('the dest directory does not exist.', -11967);
}
}
@@ -742,8 +808,7 @@ public function move(Request $request, $project_key)
->where('d', isset($document['d']) && $document['d'] === 1 ? '=' : '<>', 1)
->where('del_flag', '<>', 1)
->exists();
- if ($isExists)
- {
+ if ($isExists) {
throw new \UnexpectedValueException('the name cannot be repeated.', -11953);
}
@@ -752,23 +817,20 @@ public function move(Request $request, $project_key)
$updValues['pt'] = array_merge(isset($dest_directory['pt']) ? $dest_directory['pt'] : [], [$dest_path]);
DB::collection('wiki_' . $project_key)->where('_id', $id)->update($updValues);
- if (isset($document['d']) && $document['d'] === 1)
- {
+ if (isset($document['d']) && $document['d'] === 1) {
$subs = DB::collection('wiki_' . $project_key)
->where('pt', $id)
->where('del_flag', '<>', 1)
->get();
- foreach ($subs as $sub)
- {
- $pt = isset($sub['pt']) ? $sub['pt'] : [];
- $pind = array_search($id, $pt);
- if ($pind !== false)
- {
- $tail = array_slice($pt, $pind);
- $pt = array_merge($updValues['pt'], $tail);
- DB::collection('wiki_' . $project_key)->where('_id', $sub['_id']->__toString())->update(['pt' => $pt]);
- }
- }
+ foreach ($subs as $sub) {
+ $pt = isset($sub['pt']) ? $sub['pt'] : [];
+ $pind = array_search($id, $pt);
+ if ($pind !== false) {
+ $tail = array_slice($pt, $pind);
+ $pt = array_merge($updValues['pt'], $tail);
+ DB::collection('wiki_' . $project_key)->where('_id', $sub['_id']->__toString())->update(['pt' => $pt]);
+ }
+ }
}
$document = DB::collection('wiki_' . $project_key)->where('_id', $id)->first();
@@ -787,30 +849,26 @@ public function destroy($project_key, $id)
$document = DB::collection('wiki_' . $project_key)
->where('_id', $id)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- if (isset($document['d']) && $document['d'] === 1)
- {
- if (!$this->isPermissionAllowed($project_key, 'manage_project'))
- {
+ if (isset($document['d']) && $document['d'] === 1) {
+ if (!$this->isPermissionAllowed($project_key, 'manage_project')) {
return Response()->json(['ecode' => -10002, 'emsg' => 'permission denied.']);
}
}
- DB::collection('wiki_' . $project_key)->where('_id', $id)->update([ 'del_flag' => 1 ]);
+ DB::collection('wiki_' . $project_key)->where('_id', $id)->update(['del_flag' => 1]);
- if (isset($document['d']) && $document['d'] === 1)
- {
- DB::collection('wiki_' . $project_key)->whereRaw([ 'pt' => $id ])->update([ 'del_flag' => 1 ]);
+ if (isset($document['d']) && $document['d'] === 1) {
+ DB::collection('wiki_' . $project_key)->whereRaw(['pt' => $id])->update(['del_flag' => 1]);
}
- $user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new WikiEvent($project_key, $user, [ 'event_key' => 'delete_wiki', 'wiki_id' => $id ]));
+ $user = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
+ Event::dispatch(new WikiEvent($project_key, $user, ['event_key' => 'delete_wiki', 'wiki_id' => $id]));
- return Response()->json(['ecode' => 0, 'data' => [ 'id' => $id ]]);
+ return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
/**
@@ -824,56 +882,56 @@ public function destroy($project_key, $id)
*/
public function upload(Request $request, $project_key, $wid)
{
- set_time_limit(0);
-
- if (!is_writable(config('filesystems.disks.local.root', '/tmp')))
- {
- throw new \UnexpectedValueException('the user has not the writable permission to the directory.', -15103);
- }
-
- $fields = array_keys($_FILES);
- $field = array_pop($fields);
- if (empty($_FILES) || $_FILES[$field]['error'] > 0)
- {
- throw new \UnexpectedValueException('upload file errors.', -11959);
- }
+ @ini_set('max_execution_time', '0');
+ ignore_user_abort(true);
$document = DB::collection('wiki_' . $project_key)
->where('_id', $wid)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- $basename = md5(microtime() . $_FILES[$field]['name']);
- $sub_save_path = config('filesystems.disks.local.root', '/tmp') . '/' . substr($basename, 0, 2) . '/';
- if (!is_dir($sub_save_path))
- {
- @mkdir($sub_save_path);
+
+ $fields = array_keys($_FILES);
+ $field = array_pop($fields);
+ FilesModel::setProjectKey($project_key);
+ $file = $request->file($field);
+ if (!$file->isValid()) {
+ throw new \UnexpectedValueException('upload file errors.', -11959);
}
- move_uploaded_file($_FILES[$field]['tmp_name'], $sub_save_path . $basename);
- $data = [];
+ // $content = file_get_contents($file->getPathname());
+ // if (!$content) {
+ // throw new \UnexpectedValueException('upload file errors.', -11959);
+ // }
+
- $data['name'] = $_FILES[$field]['name'];;
- $data['size'] = $_FILES[$field]['size'];
- $data['type'] = $_FILES[$field]['type'];
- $data['id'] = $data['index'] = $basename;
+ $basename = FilesModel::basePath($file->getClientOriginalName());
+ $sub_save_path = FilesModel::absPath(null);
+ $filename = $sub_save_path . $basename;
- $data['uploader'] = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
+ $data = [];
+ $data['name'] = $file->getClientOriginalName();
+ $data['size'] = $file->getSize();
+ $data['type'] = $file->getClientMimeType();
+ $data['index'] = $basename;
+ $data['id'] = substr(md5($basename . "_" . time()), 8, 16);
+ $data['uploader'] = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
$data['uploaded_at'] = time();
+ $uploaded = FilesModel::saveTo($file, $filename);
+ if (!$uploaded) {
+ throw new \UnexpectedValueException('save file with error.', -11959);
+ }
+
$attachments = [];
- if (isset($document['attachments']) && $document['attachments'])
- {
+ if (isset($document['attachments']) && $document['attachments']) {
$attachments = $document['attachments'];
}
-
$attachments[] = $data;
- DB::collection('wiki_' . $project_key)->where('_id', $wid)->update([ 'attachments' => $attachments ]);
-
+ DB::collection('wiki_' . $project_key)->where('_id', $wid)->update(['attachments' => $attachments]);
return Response()->json(['ecode' => 0, 'data' => $data]);
}
@@ -891,27 +949,23 @@ public function remove(Request $request, $project_key, $wid, $fid)
->where('_id', $wid)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- if (!isset($document['attachments']) || !$document['attachments'])
- {
+ if (!isset($document['attachments']) || !$document['attachments']) {
throw new \UnexpectedValueException('the file does not exist.', -11958);
}
$new_attachments = [];
- foreach ($document['attachments'] as $a)
- {
- if ($a['id'] !== $fid)
- {
+ foreach ($document['attachments'] as $a) {
+ if ($a['id'] !== $fid) {
$new_attachments[] = $a;
}
}
- DB::collection('wiki_' . $project_key)->where('_id', $wid)->update([ 'attachments' => $new_attachments ]);
- return Response()->json(['ecode' => 0, 'data' => [ 'id' => $fid ]]);
+ DB::collection('wiki_' . $project_key)->where('_id', $wid)->update(['attachments' => $new_attachments]);
+ return Response()->json(['ecode' => 0, 'data' => ['id' => $fid]]);
}
/**
@@ -930,16 +984,13 @@ public function download2(Request $request, $project_key, $wid)
->where('_id', $wid)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- if (!isset($document['attachments']) || !$document['attachments'])
- {
+ if (!isset($document['attachments']) || !$document['attachments']) {
throw new \UnexpectedValueException('the file does not exist.', -11958);
}
-
$this->downloadFolder($document['name'], $document['attachments']);
}
@@ -960,32 +1011,26 @@ public function download(Request $request, $project_key, $wid, $fid)
->where('_id', $wid)
->where('del_flag', '<>', 1)
->first();
- if (!$document)
- {
+ if (!$document) {
throw new \UnexpectedValueException('the object does not exist.', -11954);
}
- if (!isset($document['attachments']) || !$document['attachments'])
- {
+ if (!isset($document['attachments']) || !$document['attachments']) {
throw new \UnexpectedValueException('the file does not exist.', -11958);
}
$isExists = false;
- foreach ($document['attachments'] as $file)
- {
- if (isset($file['id']) && $file['id'] === $fid)
- {
+ foreach ($document['attachments'] as $file) {
+ if (isset($file['id']) && $file['id'] === $fid) {
$isExists = true;
break;
}
}
-
- if (!$isExists)
- {
+ if (!$isExists) {
throw new \UnexpectedValueException('the file does not exist.', -11958);
}
- $this->downloadFile($file['name'], $file['index']);
+ return $this->downloadFile($file['name'], $file['index']);
}
/**
@@ -997,31 +1042,38 @@ public function download(Request $request, $project_key, $wid, $fid)
*/
public function downloadFolder($name, $attachments)
{
- setlocale(LC_ALL, 'zh_CN.UTF-8');
+ setlocale(LC_ALL, 'zh_CN.UTF-8');
$basepath = '/tmp/' . md5($this->user->id . microtime());
@mkdir($basepath);
-
$fullpath = $basepath . '/' . $name;
@mkdir($fullpath);
- foreach ($attachments as $attachment)
- {
- $filepath = config('filesystems.disks.local.root', '/tmp') . '/' . substr($attachment['index'], 0, 2);
- $filename = $filepath . '/' . $attachment['index'];
- if (file_exists($filename))
- {
- @copy($filename, $fullpath . '/' . $attachment['name']);
+
+ foreach ($attachments as $doc) {
+
+ $filename = FilesModel::absPath($doc['index']);
+ if (FilesModel::defaultDisk() == 'local') {
+ if (file_exists($filename)) {
+ @copy($filename, $fullpath . '/' . $doc['name']);
+ }
+ } else {
+ $disk = FilesModel::disk();
+ $exists = $disk->has($filename);
+ if ($exists) {
+ $contents = $disk->read($filename);
+ file_put_contents(FilesModel::absPath($fullpath . '/' . $doc['name'], true), $contents);
+ }
}
}
- $fname = $basepath . '/' . $name . '.zip';
- Zipper::make($fname)->folder($name)->add($basepath . '/' . $name);
- Zipper::close();
-
- File::download($fname, $name . '.zip');
- exec('rm -rf ' . $basepath);
+ $filename = $basepath . '/' . $name . '.zip';
+ $zipper = new Zipper();
+ $zipper->make($filename)->folder($name)->add($basepath . '/' . $name);
+ $zipper->close();
+ File::download($filename, $name . '.zip');
+ FilesModel::rmdir($basepath);
}
/**
@@ -1033,13 +1085,44 @@ public function downloadFolder($name, $attachments)
*/
public function downloadFile($name, $index)
{
- $filepath = config('filesystems.disks.local.root', '/tmp') . '/' . substr($index, 0, 2);
- $filename = $filepath . '/' . $index;
- if (!file_exists($filename))
- {
- throw new \UnexpectedValueException('file does not exist.', -11958);
+ $filename = FilesModel::absPath($index);
+ if (FilesModel::defaultDisk() == 'local') {
+ if (!file_exists($filename)) {
+ throw new \UnexpectedValueException('file does not exist.', -11958);
+ }
+ File::download($filename, $name);
+ } else {
+ $url = FilesModel::disk()->getUrl($index);
+ return redirect()->away($url);
+ }
+ }
+
+ /**
+ * favorite action.
+ *
+ * @param string $project_key
+ * @param string $id
+ * @return \Illuminate\Http\Response
+ */
+ public function favorite(Request $request, $project_key, $id)
+ {
+ $document = DB::collection('wiki_' . $project_key)
+ ->where('_id', $id)
+ ->where('del_flag', '<>', 1)
+ ->first();
+ if (!$document) {
+ throw new \UnexpectedValueException('the object does not exist.', -11954);
+ }
+
+ WikiFavorites::where('wid', $id)->where('user.id', $this->user->id)->delete();
+
+ $cur_user = ['id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email];
+
+ $flag = $request->input('flag');
+ if (isset($flag) && $flag) {
+ WikiFavorites::create(['project_key' => $project_key, 'wid' => $id, 'user' => $cur_user]);
}
- File::download($filename, $name);
+ return Response()->json(['ecode' => 0, 'data' => ['id' => $id, 'user' => $cur_user, 'favorited' => $flag]]);
}
}
diff --git a/app/Http/Controllers/WorkflowController.php b/app/Http/Controllers/WorkflowController.php
old mode 100644
new mode 100755
diff --git a/app/Http/Controllers/WorklogController.php b/app/Http/Controllers/WorklogController.php
old mode 100644
new mode 100755
index d15ff321a..458a3da2e
--- a/app/Http/Controllers/WorklogController.php
+++ b/app/Http/Controllers/WorklogController.php
@@ -5,7 +5,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Event;
use App\Events\IssueEvent;
-
+use Illuminate\Support\Arr;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Project\Eloquent\Worklog;
@@ -114,9 +114,8 @@ public function store(Request $request, $project_key, $issue_id)
$recorder = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
$worklog = Worklog::create([ 'project_key' => $project_key, 'issue_id' => $issue_id, 'recorder' => $recorder, 'recorded_at' => time() ] + $values);
-
// trigger event of issue worklog added
- Event::fire(new IssueEvent($project_key, $issue_id, $recorder, [ 'event_key' => 'add_worklog', 'data' => $values ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $recorder, [ 'event_key' => 'add_worklog', 'data' => $values ]));
return Response()->json(['ecode' => 0, 'data' => $worklog]);
}
@@ -228,12 +227,12 @@ public function update(Request $request, $project_key, $issue_id, $id)
{
$values['comments'] = $comments ?: '';
}
- $worklog->fill([ 'edited_flag' => 1 ] + array_except($values, [ 'recorder', 'recorded_at' ]))->save();
+ $worklog->fill([ 'edited_flag' => 1 ] + Arr::except($values, [ 'recorder', 'recorded_at' ]))->save();
// trigger event of worklog edited
$worklog = Worklog::find($id);
$cur_user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new IssueEvent($project_key, $issue_id, $cur_user, [ 'event_key' => 'edit_worklog', 'data' => $worklog->toArray() ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $cur_user, [ 'event_key' => 'edit_worklog', 'data' => $worklog->toArray() ]));
return Response()->json(['ecode' => 0, 'data' => $worklog]);
}
@@ -261,7 +260,7 @@ public function destroy($project_key, $issue_id, $id)
// trigger event of worklog deleted
$cur_user = [ 'id' => $this->user->id, 'name' => $this->user->first_name, 'email' => $this->user->email ];
- Event::fire(new IssueEvent($project_key, $issue_id, $cur_user, [ 'event_key' => 'del_worklog', 'data' => $worklog->toArray() ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $cur_user, [ 'event_key' => 'del_worklog', 'data' => $worklog->toArray() ]));
return Response()->json(['ecode' => 0, 'data' => ['id' => $id]]);
}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
old mode 100644
new mode 100755
index ad8225ca4..33d44047a
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -49,6 +49,7 @@ class Kernel extends HttpKernel
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \App\Http\Middleware\Authorize::class,
'privilege' => \App\Http\Middleware\Privilege::class,
+ 'checkProjectStatus' => \App\Http\Middleware\CheckProjectStatus::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
diff --git a/app/Http/Middleware/AccessLogs.php b/app/Http/Middleware/AccessLogs.php
old mode 100644
new mode 100755
index 11be062b4..ff7fc46f8
--- a/app/Http/Middleware/AccessLogs.php
+++ b/app/Http/Middleware/AccessLogs.php
@@ -7,6 +7,7 @@
use Sentinel;
use App\System\Eloquent\ApiAccessLogs;
+use Illuminate\Support\Arr;
class AccessLogs
{
@@ -34,12 +35,12 @@ public function handle($request, Closure $next)
$request_url = $request->getRequestUri();
$module = $project_key = '';
$matches = [];
- if (preg_match("/^\/api\/project\/([^\/]+)\/([^\/\?]+)(.*)/i", $request_url, $matches))
+ if (preg_match("/^\/actionview\/api\/project\/([^\/]+)\/([^\/\?]+)(.*)/i", $request_url, $matches))
{
$project_key = $matches[1];
$module = $matches[2];
}
- else if ($request_method == 'POST' && strpos($request_url, '/api/session') !== false)
+ else if ($request_method == 'POST' && strpos($request_url, '/actionview/api/session') !== false)
{
$module = 'login';
}
@@ -55,7 +56,7 @@ public function handle($request, Closure $next)
'request_url' => $request_url,
'request_user_agent' => $request->header('USER_AGENT'),
'request_method' => $request_method,
- 'request_body' => in_array($request_method, [ 'PUT', 'POST' ]) ? array_except($request->all(), [ 'password', 'new_password', 'token', 'pwd', 'admin_password' ]) : [],
+ 'request_body' => in_array($request_method, [ 'PUT', 'POST' ]) ? Arr::except($request->all(), [ 'password', 'new_password', 'token', 'pwd', 'admin_password' ]) : [],
'response_status' => $response->getstatusCode(),
]);
diff --git a/app/Http/Middleware/ArrangeResponseData.php b/app/Http/Middleware/ArrangeResponseData.php
old mode 100644
new mode 100755
diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php
index b16a5baf6..704089a7f 100644
--- a/app/Http/Middleware/Authenticate.php
+++ b/app/Http/Middleware/Authenticate.php
@@ -2,29 +2,20 @@
namespace App\Http\Middleware;
-use Closure;
-use Illuminate\Support\Facades\Auth;
+use Illuminate\Auth\Middleware\Authenticate as Middleware;
-class Authenticate
+class Authenticate extends Middleware
{
/**
- * Handle an incoming request.
+ * Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
- * @param \Closure $next
- * @param string|null $guard
- * @return mixed
+ * @return string|null
*/
- public function handle($request, Closure $next, $guard = null)
+ protected function redirectTo($request)
{
- if (Auth::guard($guard)->guest()) {
- if ($request->ajax() || $request->wantsJson()) {
- return response('Unauthorized.', 401);
- }
-
- return redirect()->guest('login');
+ if (! $request->expectsJson()) {
+ return route('login');
}
-
- return $next($request);
}
}
diff --git a/app/Http/Middleware/Authorize.php b/app/Http/Middleware/Authorize.php
old mode 100644
new mode 100755
index 345d90a74..070b43800
--- a/app/Http/Middleware/Authorize.php
+++ b/app/Http/Middleware/Authorize.php
@@ -18,6 +18,7 @@ class Authorize
*/
public function handle($request, Closure $next)
{
+
$setting = SysSetting::first();
if (!($setting && isset($setting->properties) && isset($setting->properties['enable_login_protection']) && $setting->properties['enable_login_protection'] === 1))
{
diff --git a/app/Http/Middleware/CheckProjectStatus.php b/app/Http/Middleware/CheckProjectStatus.php
new file mode 100755
index 000000000..253e5ae18
--- /dev/null
+++ b/app/Http/Middleware/CheckProjectStatus.php
@@ -0,0 +1,32 @@
+project_key;
+ if (!$request->isMethod('get') && $project_key !== '$_sys_$')
+ {
+ $project = Project::where('key', $project_key)->first();
+ if ($project->status != 'active')
+ {
+ return Response()->json(['ecode' => -14009, 'emsg' => 'the project has been archived.']);
+ }
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php
index 3aa15f8dd..033136ad1 100644
--- a/app/Http/Middleware/EncryptCookies.php
+++ b/app/Http/Middleware/EncryptCookies.php
@@ -2,9 +2,9 @@
namespace App\Http\Middleware;
-use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter;
+use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
-class EncryptCookies extends BaseEncrypter
+class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php
new file mode 100644
index 000000000..e4956d0bb
--- /dev/null
+++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php
@@ -0,0 +1,17 @@
+check()) {
- return redirect('/');
+ $guards = empty($guards) ? [null] : $guards;
+
+ foreach ($guards as $guard) {
+ if (Auth::guard($guard)->check()) {
+ return redirect(RouteServiceProvider::HOME);
+ }
}
return $next($request);
diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php
index 89eaaaae7..a8a252df4 100644
--- a/app/Http/Middleware/TrimStrings.php
+++ b/app/Http/Middleware/TrimStrings.php
@@ -2,28 +2,18 @@
namespace App\Http\Middleware;
-use Illuminate\Http\JsonResponse;
-use Closure;
+use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
-class TrimStrings
+class TrimStrings extends Middleware
{
/**
- * Handle an incoming request.
+ * The names of the attributes that should not be trimmed.
*
- * @param \Illuminate\Http\Request $request
- * @param \Closure $next
- * @return mixed
+ * @var array
*/
- public function handle($request, Closure $next)
- {
- $params = $request->all();
- foreach ($params as $k => $v)
- {
- if (is_string($v))
- {
- $request->offsetSet($k, trim($v));
- }
- }
- return $next($request);
- }
+ protected $except = [
+ 'current_password',
+ 'password',
+ 'password_confirmation',
+ ];
}
diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php
new file mode 100644
index 000000000..b0550cfc7
--- /dev/null
+++ b/app/Http/Middleware/TrustHosts.php
@@ -0,0 +1,20 @@
+allSubdomainsOfApplicationUrl(),
+ ];
+ }
+}
diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php
new file mode 100644
index 000000000..a3b6aef90
--- /dev/null
+++ b/app/Http/Middleware/TrustProxies.php
@@ -0,0 +1,23 @@
+input('_token') ?: $request->header('X-CSRF-TOKEN', $request->cookie('XSRF-TOKEN'));
+
+ if (!$token && $header = $request->header('X-XSRF-TOKEN')) {
+ try {
+ $token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
+ } catch (DecryptException $e) {
+ $token = '';
+ }
+ }
+
+ return $token;
+ }
}
diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php
old mode 100644
new mode 100755
diff --git a/app/Http/routes.php b/app/Http/routes.php
old mode 100644
new mode 100755
index 0b0efe703..8bc2bba1b
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -11,82 +11,87 @@
|
*/
+$api_prefix = 'actionview/api';
+
Route::get('/', function () {
return view('welcome');
});
// session router
-Route::post('api/session', 'SessionController@create');
-Route::get('api/session', 'SessionController@getSess');
-Route::delete('api/session', 'SessionController@destroy');
+Route::post($api_prefix . '/session', 'SessionController@create');
+Route::get($api_prefix . '/session', 'SessionController@getSess');
+Route::delete($api_prefix . '/session', 'SessionController@destroy');
-Route::post('api/user/register', 'UserController@register');
+Route::post($api_prefix . '/user/login', 'UserController@login');
+Route::post($api_prefix . '/user/register', 'UserController@register');
-Route::post('api/user/resetpwdsendmail', 'UserController@sendMailForResetpwd');
-Route::get('api/user/resetpwd', 'UserController@showResetpwd');
-Route::post('api/user/resetpwd', 'UserController@doResetpwd');
+Route::post($api_prefix .'/user/resetpwdsendmail', 'UserController@sendMailForResetpwd');
+Route::get($api_prefix . '/user/resetpwd', 'UserController@showResetpwd');
+Route::post($api_prefix . '/user/resetpwd', 'UserController@doResetpwd');
// holida api
-Route::get('api/holiday/{year}', 'HolidayController@index');
+Route::get($api_prefix . '/holiday/{year}', 'HolidayController@index');
// webhook api
-Route::post('api/webhook/{type}/project/{key}', 'WebhookController@exec');
+Route::post($api_prefix . '/webhook/{type}/project/{key}', 'WebhookController@exec');
-Route::group([ 'middleware' => 'can' ], function () {
+Route::group([ 'prefix' => $api_prefix, 'middleware' => 'can' ], function () {
// project route
- Route::get('api/myproject', 'ProjectController@myproject');
- Route::get('api/project/recent', 'ProjectController@recent');
- Route::get('api/project', 'ProjectController@index');
- Route::get('api/project/checkkey/{key}', 'ProjectController@checkKey');
- Route::get('api/project/options', 'ProjectController@getOptions');
- Route::get('api/project/search', 'ProjectController@search');
- Route::get('api/project/{key}', 'ProjectController@show');
- Route::post('api/project', 'ProjectController@store');
- Route::put('api/project/{id}', 'ProjectController@update');
- Route::get('api/project/{id}/createindex', 'ProjectController@createIndex');
- Route::post('api/project/batch/status', 'ProjectController@updMultiStatus');
- Route::post('api/project/batch/createindex', 'ProjectController@createMultiIndex');
- Route::delete('api/project/{id}', 'ProjectController@destroy');
-
- Route::get('api/user/search', 'UserController@search');
- Route::get('api/user/{id}/renewpwd', 'UserController@renewPwd');
- Route::post('api/user/batch/delete', 'UserController@delMultiUsers');
- Route::post('api/user/batch/invalidate', 'UserController@invalidateMultiUsers');
- Route::post('api/user/fileupload', 'UserController@upload');
- Route::post('api/user/imports', 'UserController@imports');
- Route::resource('api/user', 'UserController');
-
- Route::get('api/logs', 'AccessLogsController@index');
-
- Route::get('api/calendar/{year}', 'CalendarController@index');
- Route::post('api/calendar', 'CalendarController@update');
- Route::post('api/calendar/sync', 'CalendarController@sync');
-
- Route::get('api/group/search', 'GroupController@search');
- Route::post('api/group/batch/delete', 'GroupController@delMultiGroups');
- Route::resource('api/group', 'GroupController');
-
- Route::get('api/directory/{id}/test', 'DirectoryController@test');
- Route::get('api/directory/{id}/sync', 'DirectoryController@sync');
- Route::resource('api/directory', 'DirectoryController');
-
- Route::get('api/mysetting', 'MysettingController@show');
- Route::post('api/mysetting/account', 'MysettingController@updAccounts');
- Route::post('api/mysetting/resetpwd', 'MysettingController@resetPwd');
- Route::post('api/mysetting/notify', 'MysettingController@setNotifications');
- Route::post('api/mysetting/favorite', 'MysettingController@setFavorites');
- Route::post('api/mysetting/avatar', 'MysettingController@setAvatar');
+ Route::get('myproject', 'ProjectController@myproject');
+ Route::get('project/recent', 'ProjectController@recent');
+ Route::get('project/stats', 'ProjectController@stats');
+ Route::get('project', 'ProjectController@index');
+ Route::get('project/checkkey/{key}', 'ProjectController@checkKey');
+ Route::get('project/options', 'ProjectController@getOptions');
+ Route::get('project/search', 'ProjectController@search');
+ Route::get('project/{key}', 'ProjectController@show');
+ Route::post('project', 'ProjectController@store');
+ Route::put('project/{id}', 'ProjectController@update');
+ Route::get('project/{id}/createindex', 'ProjectController@createIndex');
+ Route::post('project/batch/status', 'ProjectController@updMultiStatus');
+ Route::post('project/batch/createindex', 'ProjectController@createMultiIndex');
+ Route::delete('project/{id}', 'ProjectController@destroy');
+
+ Route::get('user/search', 'UserController@search');
+ Route::get('user/{id}/renewpwd', 'UserController@renewPwd');
+ Route::post('user/batch/delete', 'UserController@delMultiUsers');
+ Route::post('user/batch/invalidate', 'UserController@invalidateMultiUsers');
+ Route::post('user/fileupload', 'UserController@upload');
+ Route::post('user/imports', 'UserController@imports');
+ Route::resource('user', 'UserController');
+
+ Route::get('logs', 'AccessLogsController@index');
+
+ Route::get('calendar/{year}', 'CalendarController@index');
+ Route::post('calendar', 'CalendarController@update');
+ Route::post('calendar/sync', 'CalendarController@sync');
+
+ Route::get('group/search', 'GroupController@search');
+ Route::get('mygroup', 'GroupController@mygroup');
+ Route::post('group/batch/delete', 'GroupController@delMultiGroups');
+ Route::resource('group', 'GroupController');
+
+ Route::get('directory/{id}/test', 'DirectoryController@test');
+ Route::get('directory/{id}/sync', 'DirectoryController@sync');
+ Route::resource('directory', 'DirectoryController');
+
+ Route::get('mysetting', 'MysettingController@show');
+ Route::post('mysetting/account', 'MysettingController@updAccounts');
+ Route::post('mysetting/resetpwd', 'MysettingController@resetPwd');
+ Route::post('mysetting/notify', 'MysettingController@setNotifications');
+ Route::post('mysetting/favorite', 'MysettingController@setFavorites');
+ Route::post('mysetting/avatar', 'MysettingController@setAvatar');
// middleware is put into controller
- Route::get('api/syssetting', 'SyssettingController@show');
- Route::post('api/syssetting', 'SyssettingController@update');
- Route::post('api/syssetting/restpwd', 'SyssettingController@resetPwd');
- Route::post('api/syssetting/sendtestmail', 'SyssettingController@sendTestMail');
+ Route::get('syssetting', 'SyssettingController@show');
+ Route::post('syssetting', 'SyssettingController@update');
+ Route::post('syssetting/restpwd', 'SyssettingController@resetPwd');
+ Route::post('syssetting/sendtestmail', 'SyssettingController@sendTestMail');
- Route::get('api/getavatar', 'FileController@getAvatar');
- Route::post('api/tmpfile', 'FileController@uploadTmpFile');
+ Route::get('getavatar', 'FileController@getAvatar');
+ Route::post('tmpfile', 'FileController@uploadTmpFile');
});
// project config
-Route::group([ 'prefix' => 'api/project/{project_key}', 'middleware' => [ 'can', 'privilege:manage_project' ] ], function () {
+Route::group([ 'prefix' => $api_prefix . '/project/{project_key}', 'middleware' => [ 'can', 'checkProjectStatus', 'privilege:manage_project' ] ], function () {
// project type config
Route::resource('type', 'TypeController');
Route::post('type/batch', 'TypeController@handle');
@@ -127,9 +132,12 @@
Route::post('integrations', 'ExternalUsersController@handle');
Route::resource('webhooks', 'WebhooksController');
+
+ Route::post('labels/{id}/delete', 'LabelsController@delete');
+ Route::resource('labels', 'LabelsController');
});
-Route::group([ 'prefix' => 'api/project/{project_key}', 'middleware' => [ 'can', 'privilege:view_project' ] ], function () {
+Route::group([ 'prefix' => $api_prefix . '/project/{project_key}', 'middleware' => [ 'can', 'checkProjectStatus', 'privilege:view_project' ] ], function () {
// project summary
Route::get('summary', 'SummaryController@index');
// config summary
@@ -169,13 +177,15 @@
Route::post('issue/filter', 'IssueController@saveIssueFilter');
Route::get('issue/filters', 'IssueController@getIssueFilters');
Route::get('issue/filters/reset', 'IssueController@resetIssueFilters');
- Route::post('issue/filters', 'IssueController@editFilters');
+ Route::post('issue/filters', 'IssueController@batchHandleFilters');
Route::post('issue/columns', 'IssueController@setDisplayColumns');
Route::post('issue/columns/reset', 'IssueController@resetDisplayColumns');
Route::post('issue/imports', 'IssueController@imports');
+ Route::post('issue/batch', 'IssueController@batchHandle');
+
Route::get('issue/{id}', 'IssueController@show');
Route::get('issue', 'IssueController@index');
Route::post('issue', [ 'middleware' => 'privilege:create_issue', 'uses' => 'IssueController@store' ]);
@@ -208,11 +218,13 @@
Route::post('file', [ 'middleware' => 'privilege:upload_file', 'uses' => 'FileController@upload' ]);
Route::get('file/{id}/thumbnail', 'FileController@downloadThumbnail');
- Route::get('file/{id}', [ 'middleware' => 'privilege:download_file', 'uses' => 'FileController@download' ]);
+ Route::get('file/{id}/{name?}', [ 'middleware' => 'privilege:download_file', 'uses' => 'FileController@download' ]);
Route::delete('file/{id}', 'FileController@delete');
+ Route::post('document/{id}/favorite', 'DocumentController@favorite');
Route::post('document/{id}/upload', 'DocumentController@upload');
- Route::get('document/{id}/download', 'DocumentController@download');
+ Route::get('document/{id}/download/{name?}', 'DocumentController@download');
+ Route::get('document/{id}/downloadthumbnails', 'DocumentController@downloadThumbnails');
Route::get('document/options', 'DocumentController@getOptions');
Route::get('document/directory/{id}', 'DocumentController@index');
Route::get('document/search/path', 'DocumentController@searchPath');
@@ -220,7 +232,12 @@
Route::post('document/{id}', [ 'middleware' => 'privilege:manage_project', 'uses' => 'DocumentController@createFolder' ]);
Route::put('document/{id}', 'DocumentController@update');
Route::delete('document/{id}', 'DocumentController@destroy');
+ Route::get('document/dirtree', 'DocumentController@getDirTree');
+ Route::get('document/{id}/dirs', 'DocumentController@getDirChildren');
+ Route::get('wiki/dirtree', 'WikiController@getDirTree');
+ Route::get('wiki/{id}/dirs', 'WikiController@getDirChildren');
+ Route::post('wiki/{id}/favorite', 'WikiController@favorite');
Route::post('wiki/{id}/upload', 'WikiController@upload');
Route::get('wiki/{id}/download', 'WikiController@download2');
Route::get('wiki/{id}/file/{fid}/download', 'WikiController@download');
@@ -243,6 +260,7 @@
Route::post('sprint', 'SprintController@store');
Route::post('sprint/moveissue', 'SprintController@moveIssue');
Route::post('sprint/{no}/publish', 'SprintController@publish');
+ Route::put('sprint/{no}', 'SprintController@update');
Route::post('sprint/{no}/complete', 'SprintController@complete');
Route::get('sprint/{no}/log', 'SprintController@getLog');
Route::get('sprint/{no}', 'SprintController@show');
diff --git a/app/Jobs/Job.php b/app/Jobs/Job.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/.gitkeep b/app/Listeners/.gitkeep
old mode 100644
new mode 100755
diff --git a/app/Listeners/ActivityAddListener.php b/app/Listeners/ActivityAddListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/EventListener.php b/app/Listeners/EventListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/FieldConfigChangeListener.php b/app/Listeners/FieldConfigChangeListener.php
old mode 100644
new mode 100755
index 372d6f224..f2cc9f01c
--- a/app/Listeners/FieldConfigChangeListener.php
+++ b/app/Listeners/FieldConfigChangeListener.php
@@ -73,7 +73,7 @@ public function updateSchema($field_id, $flag)
if ($flag == 1)
{
- $new_field = Field::Find($field_id, ['name', 'key', 'type', 'applyToTypes', 'defaultValue', 'optionValues'])->toArray();
+ $new_field = Field::Find($field_id, ['name', 'key', 'type', 'applyToTypes', 'defaultValue', 'optionValues', 'minValue', 'maxValue', 'maxLength'])->toArray();
if (isset($field['required']) && $field['required'])
{
$new_field['required'] = true;
diff --git a/app/Listeners/FileChangeListener.php b/app/Listeners/FileChangeListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/GroupDelListener.php b/app/Listeners/GroupDelListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/GroupRoleSetListener.php b/app/Listeners/GroupRoleSetListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/NoticeAddListener.php b/app/Listeners/NoticeAddListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/PropertyConfigChangeListener.php b/app/Listeners/PropertyConfigChangeListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/UserDelListener.php b/app/Listeners/UserDelListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/UserRoleSetListener.php b/app/Listeners/UserRoleSetListener.php
old mode 100644
new mode 100755
diff --git a/app/Listeners/WebhooksRequestListener.php b/app/Listeners/WebhooksRequestListener.php
old mode 100644
new mode 100755
diff --git a/app/Models/Files.php b/app/Models/Files.php
new file mode 100755
index 000000000..5f1cdfa1c
--- /dev/null
+++ b/app/Models/Files.php
@@ -0,0 +1,534 @@
+ "application/postscript",
+ "aif" => "audio/x-aiff",
+ "aifc" => "audio/x-aiff",
+ "aiff" => "audio/x-aiff",
+ "asc" => "text/plain",
+ "au" => "audio/basic",
+ "avi" => "video/x-msvideo",
+ "bcpio" => "application/x-bcpio",
+ "bin" => "application/octet-stream",
+ "c" => "text/plain",
+ "cc" => "text/plain",
+ "ccad" => "application/clariscad",
+ "cdf" => "application/x-netcdf",
+ "class" => "application/octet-stream",
+ "cpio" => "application/x-cpio",
+ "cpt" => "application/mac-compactpro",
+ "csh" => "application/x-csh",
+ "css" => "text/css",
+ "dir" => "application/x-director",
+ "dms" => "application/octet-stream",
+ "doc" => "application/msword",
+ "drw" => "application/drafting",
+ "dvi" => "application/x-dvi",
+ "dwg" => "application/acad",
+ "dxf" => "application/dxf",
+ "dxr" => "application/x-director",
+ "eps" => "application/postscript",
+ "etx" => "text/x-setext",
+ "exe" => "application/octet-stream",
+ "ez" => "application/andrew-inset",
+ "f" => "text/plain",
+ "f90" => "text/plain",
+ "fli" => "video/x-fli",
+ "gif" => "image/gif",
+ "gtar" => "application/x-gtar",
+ "gz" => "application/x-gzip",
+ "h" => "text/plain",
+ "hdf" => "application/x-hdf",
+ "hh" => "text/plain",
+ "hqx" => "application/mac-binhex40",
+ "htm" => "text/html",
+ "html" => "text/html",
+ "ice" => "x-conference/x-cooltalk",
+ "ief" => "image/ief",
+ "iges" => "model/iges",
+ "igs" => "model/iges",
+ "ips" => "application/x-ipscript",
+ "ipx" => "application/x-ipix",
+ "jpe" => "image/jpeg",
+ "jpeg" => "image/jpeg",
+ "jpg" => "image/jpeg",
+ "js" => "application/x-javascript",
+ "kar" => "audio/midi",
+ "latex" => "application/x-latex",
+ "lha" => "application/octet-stream",
+ "lsp" => "application/x-lisp",
+ "lzh" => "application/octet-stream",
+ "m" => "text/plain",
+ "man" => "application/x-troff-man",
+ "me" => "application/x-troff-me",
+ "mesh" => "model/mesh",
+ "mid" => "audio/midi",
+ "midi" => "audio/midi",
+ "mif" => "application/vnd.mif",
+ "mime" => "www/mime",
+ "mov" => "video/quicktime",
+ "movie" => "video/x-sgi-movie",
+ "mp2" => "audio/mpeg",
+ "mp3" => "audio/mpeg",
+ "mpe" => "video/mpeg",
+ "mpeg" => "video/mpeg",
+ "mpg" => "video/mpeg",
+ "mpga" => "audio/mpeg",
+ "ms" => "application/x-troff-ms",
+ "msh" => "model/mesh",
+ "nc" => "application/x-netcdf",
+ "oda" => "application/oda",
+ "pbm" => "image/x-portable-bitmap",
+ "pdb" => "chemical/x-pdb",
+ "pdf" => "application/pdf",
+ "pgm" => "image/x-portable-graymap",
+ "pgn" => "application/x-chess-pgn",
+ "php" => "text/plain",
+ "png" => "image/png",
+ "pnm" => "image/x-portable-anymap",
+ "pot" => "application/mspowerpoint",
+ "ppm" => "image/x-portable-pixmap",
+ "pps" => "application/mspowerpoint",
+ "ppt" => "application/mspowerpoint",
+ "ppz" => "application/mspowerpoint",
+ "pre" => "application/x-freelance",
+ "prt" => "application/pro_eng",
+ "ps" => "application/postscript",
+ "py" => "text/plain",
+ "qt" => "video/quicktime",
+ "ra" => "audio/x-realaudio",
+ "ram" => "audio/x-pn-realaudio",
+ "ras" => "image/cmu-raster",
+ "rgb" => "image/x-rgb",
+ "rm" => "audio/x-pn-realaudio",
+ "roff" => "application/x-troff",
+ "rpm" => "audio/x-pn-realaudio-plugin",
+ "rtf" => "text/rtf",
+ "rtx" => "text/richtext",
+ "scm" => "application/x-lotusscreencam",
+ "set" => "application/set",
+ "sgm" => "text/sgml",
+ "sgml" => "text/sgml",
+ "sh" => "application/x-sh",
+ "shar" => "application/x-shar",
+ "silo" => "model/mesh",
+ "sit" => "application/x-stuffit",
+ "skd" => "application/x-koan",
+ "skm" => "application/x-koan",
+ "skp" => "application/x-koan",
+ "skt" => "application/x-koan",
+ "smi" => "application/smil",
+ "smil" => "application/smil",
+ "snd" => "audio/basic",
+ "sol" => "application/solids",
+ "spl" => "application/x-futuresplash",
+ "src" => "application/x-wais-source",
+ "step" => "application/STEP",
+ "stl" => "application/SLA",
+ "stp" => "application/STEP",
+ "sv4cpio" => "application/x-sv4cpio",
+ "sv4crc" => "application/x-sv4crc",
+ "swf" => "application/x-shockwave-flash",
+ "t" => "application/x-troff",
+ "tar" => "application/x-tar",
+ "tcl" => "application/x-tcl",
+ "tex" => "application/x-tex",
+ "texi" => "application/x-texinfo",
+ "texinfo" => "application/x-texinfo",
+ "tif" => "image/tiff",
+ "tiff" => "image/tiff",
+ "tr" => "application/x-troff",
+ "tsi" => "audio/TSP-audio",
+ "tsp" => "application/dsptype",
+ "tsv" => "text/tab-separated-values",
+ "txt" => "text/plain",
+ "unv" => "application/i-deas",
+ "ustar" => "application/x-ustar",
+ "vcd" => "application/x-cdlink",
+ "vda" => "application/vda",
+ "viv" => "video/vnd.vivo",
+ "vivo" => "video/vnd.vivo",
+ "vrml" => "model/vrml",
+ "wav" => "audio/x-wav",
+ "webp" => "image/webp",
+ "wrl" => "model/vrml",
+ "xbm" => "image/x-xbitmap",
+ "xlc" => "application/vnd.ms-excel",
+ "xll" => "application/vnd.ms-excel",
+ "xlm" => "application/vnd.ms-excel",
+ "xls" => "application/vnd.ms-excel",
+ "xlw" => "application/vnd.ms-excel",
+ "xml" => "text/xml",
+ "xpm" => "image/x-xpixmap",
+ "xwd" => "image/x-xwindowdump",
+ "xyz" => "chemical/x-pdb",
+ "zip" => "application/zip"
+
+ );
+ $ext = strtolower($ext);
+ $mime_type = $extensions[$ext];
+ return $mime_type;
+ }
+
+ static function disk($type = null)
+ {
+ if (is_null($type)) $type = self::defaultDisk();
+ return Storage::disk($type);
+ }
+
+ static function setProjectKey($project_key)
+ {
+ self::$project_key = $project_key;
+ }
+
+ static function dayPath($format = 'Ym')
+ {
+ return date($format) . '/';
+ }
+
+ static function subPath($format = 'Ym')
+ {
+ $path = self::localPath() . '/' . self::dayPath($format);
+ return $path;
+ }
+
+ static function tmpDir()
+ {
+ return sys_get_temp_dir();
+ }
+
+ /**
+ * 获取绝对路径
+ * auto 为真时自动创建父级目录
+ */
+ static function absPath($file = null, $auto = false)
+ {
+ $path = self::localPath() . '/' . $file;
+ if ($auto) {
+ self::checkParent($file);
+ }
+ return $path;
+ }
+
+ static function checkParent($path)
+ {
+ if (!is_dir(dirname($path))) {
+ @mkdir(dirname($path), 0755, true);
+ }
+ return $path;
+ }
+
+ //上传处理
+ static function saveTo($file, $filename)
+ {
+ $ret = $file->storeAs(dirname($filename),basename($filename), self::defaultDisk());
+ @unlink($file->getPathname());
+ return $ret;
+ }
+
+ static function isUrl($filename)
+ {
+ if ($filename && (strpos($filename, 'http://') === 0 || strpos($filename, 'https://') === 0 || strpos($filename, 'ftp://') === 0)) {
+ return true;
+ }
+ return false;
+ }
+
+ static function getExt($filename)
+ {
+ if (self::isUrl($filename)) {
+ $path = parse_url($filename, PHP_URL_PATH);
+ $ext = pathinfo($path, PATHINFO_EXTENSION);
+ } else {
+ $ext = pathinfo($filename, PATHINFO_EXTENSION);
+ }
+ return strtolower($ext);
+ }
+
+ static function baseName($filename, $dot = null, $abs = false)
+ {
+ if (!$abs) {
+ $ext = self::getExt($filename);
+
+ if (self::isUrl($filename)) {
+ $filecode = md5($filename);
+ } else {
+ $filecode = md5(microtime() . $filename);
+ }
+ $basename = date('d_').substr($filecode, 8, 16);
+ // dump([self::isUrl($filename), $filename, $filecode, $basename]);
+ if (self::saftExt($ext)) {
+ $basename .= '.' . $ext;
+ }
+ } else {
+ $basename = $filename;
+ }
+ if ($dot) $basename .= $dot;
+ return $basename;
+ }
+
+ static function basePath($filename, $dot = null, $format = 'Ym')
+ {
+ $basename = self::baseName($filename, $dot);
+ return (self::$project_key ? self::$project_key . "/" : "") . self::dayPath($format) . $basename;
+ }
+
+ static function saftExt($ext)
+ {
+ $ext = strtolower($ext);
+ if (!in_array($ext, ['php', 'asp', 'jsp', 'exe', 'cgi', 'html', 'htm', 'jhtml', 'shtml'])) {
+ return true;
+ }
+ return false;
+ }
+
+
+ static function isImg($ext)
+ {
+ if (strpos($ext, '.') !== false) {
+ $ext = self::getExt($ext);
+ }
+ $ext = strtolower($ext);
+ if (in_array($ext, ['jpg', 'jpeg', 'gif', 'png', 'bmp', 'html', 'webp'])) {
+ return true;
+ }
+ return false;
+ }
+
+
+ static function makeThumbIndex($filename, $basename, $thumbnail_size=200)
+ {
+ $ext = self::getExt($filename);
+ if(!self::isImg($ext)) return false;
+ if(self::defaultDisk()=='local'){
+ self::makeThumb($filename, $thumbnail_size);
+ }
+ return self::baseName($basename, self::$TBDOT, true);
+ }
+
+ /**
+ * 去掉URL的?
+ */
+ static function pathUrl($url)
+ {
+ if (strpos($url, '?') == false) return $url;
+ $path = parse_url($url);
+ return $path['scheme'] . '://' . $path['host'] . (isset($path['port']) && $path['port'] ? ":" . $path['port'] : "") . $path['path'];
+ }
+
+
+ static function getUrl($url, $meta = [])
+ {
+ $client = new Client();
+ if (!$meta) {
+ $meta = [
+ "Host" => parse_url($url, PHP_URL_HOST),
+ "User-Agent" => "Mozilla/5.0 (iPhone; CPU iPhone OS 14_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.2(0x18000238) NetType/WIFI Language/zh_CN",
+ "Referer" => $url,
+ "Cookie" => "",
+ "Accept-Encoding" => "gzip, zlib, deflate, zstd, br"
+ ];
+ }
+ $request = new Request(
+ "GET",
+ $url,
+ $meta
+ );
+
+ $response = $client->send($request);
+ $body = $response->getBody();
+ $content = $body->getContents();
+ if (!$content) return false;
+ return $content;
+ }
+
+ static function localPath()
+ {
+ $saveway = self::defaultDisk();
+ if ($saveway == 'local') {
+ return config('filesystems.disks.local.root', '/tmp');
+ } else {
+ return '';
+ }
+ }
+
+ static function defaultDisk()
+ {
+ $saveway = config('filesystems.cloud', config('filesystems.default'));
+ return $saveway;
+ }
+
+
+ static function local()
+ {
+ return Storage::disk('local');
+ }
+
+ static function rmdir($dir)
+ {
+ return quickio::rmdir($dir);
+ }
+
+
+ static function makeThumb($filename, $thumbnail_size = 200)
+ {
+ if (!$filename || !is_file($filename)) return false;
+ $ext = self::getExt($filename);
+ if (!self::isImg($ext)) return false;
+ $size = @getimagesize($filename);
+ if (!$size) return false;
+ $width = $size[0];
+ $height = $size[1];
+ $scale = $width < $height ? $height : $width;
+ $thumbnails_width = floor($thumbnail_size * $width / $scale);
+ $thumbnails_height = floor($thumbnail_size * $height / $scale);
+ $thumbnails_filename = self::baseName($filename, self::$TBDOT, true);
+ self::checkParent($thumbnails_filename);
+ if ($scale <= $thumbnail_size) {
+ @copy($filename, $thumbnails_filename);
+ } else if ($ext == 'jpeg' || $ext == 'jpg') {
+ $src_image = @imagecreatefromjpeg($filename);
+ $dst_image = @imagecreatetruecolor($thumbnails_width, $thumbnails_height);
+ @imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $thumbnails_width, $thumbnails_height, $width, $height);
+ @imagejpeg($dst_image, $thumbnails_filename);
+ } else if ($ext == 'png') {
+ $src_image = @imagecreatefrompng($filename);
+ $dst_image = @imagecreatetruecolor($thumbnails_width, $thumbnails_height);
+ @imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $thumbnails_width, $thumbnails_height, $width, $height);
+ @imagepng($dst_image, $thumbnails_filename);
+ } else if ($ext == 'gif') {
+ $src_image = @imagecreatefromgif($filename);
+ $dst_image = @imagecreatetruecolor($thumbnails_width, $thumbnails_height);
+ @imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $thumbnails_width, $thumbnails_height, $width, $height);
+ @imagegif($dst_image, $thumbnails_filename);
+ } else {
+ @copy($filename, $thumbnails_filename);
+ }
+ return $thumbnails_filename;
+ }
+
+ static function downloadCreate($url, $project_key, $issue_id = null, $field = null, $tag = 'downloader', $userinfo = [])
+ {
+ $url = trim($url);
+ if (!$url) return false;
+ if (!self::isUrl($url)) return false;
+ if (!self::$project_key) return false;
+ self::setProjectKey($project_key);
+ $file = File::where('project_key', $project_key)
+ ->where('tag', $tag)
+ ->where('remote', $url)
+ // ->where('del_flg', '<>', 1) //一个站点一个标签对应只能下载一次一个地址
+ ->first();
+ if ($file) return $file;
+ $urla = self::pathUrl($url);
+ $path = parse_url($urla);
+ $data = [];
+ $data['name'] = basename($path['path']);
+ $data['size'] = 0;
+ $data['index'] = self::basePath($url);
+ $data['ext'] = self::getExt($url);
+ if (self::isImg($data['ext'])) {
+ $data['thumbnails_index'] = self::basePath($url, self::$TBDOT);
+ }
+ $data['type'] = self::extMime($data['ext']);
+ $data['tag'] = $tag;
+ $data['download_flg'] = 0; //未开始
+ $data['remote'] = $url;
+ $data['project_key'] = $project_key;
+ $data['uploader'] = $uploader = $userinfo ? $userinfo : ['id' => 0, 'name' => 'Downloader', 'email' => 'downloader@tedx.net'];
+ $file = File::create($data);
+ if ($issue_id && $field) {
+ Event::dispatch(new FileUploadEvent($project_key, $issue_id, $field, $file->id, $uploader));
+ }
+ return $file;
+ }
+
+ static function download($id)
+ {
+ if (!$id) return false;
+ $file = File::find($id);
+ if (!$file) return false;
+ if (!File::isRemote($file)) return $file;
+ if (!$file->index) return false;
+ if (isset($file->download_flg) && $file->download_flg == 1) {
+ return $file;
+ }
+ $saveway = self::defaultDisk();
+ $path = self::absPath($file->index, $saveway == 'local');
+ $content = self::getUrl($file->remote);
+ if (!$content) {
+ $file->download_flg = -1; //标记
+ $file->save();
+ return false;
+ }
+ $downloaded = Storage::disk($saveway)->put($file->index, $content);
+ if (isset($file->thumbnails_index) && $file->thumbnails_index && $saveway == 'local') { //本地就生缩略图
+ self::makeThumb($path);
+ }
+ $file->download_flg = $downloaded ? 1 : -1; //标记下载标记
+ if ($downloaded) {
+ $file->size = strlen($content);
+ }
+ $file->save();
+ return $file;
+ }
+
+ /**
+ * 替换相关文档
+ */
+ static function htmlReplace($html, $project_key, $issue_id = null, $field = null, $tag = 'downloader', $userinfo = [])
+ {
+ $data = QueryList::html($html)->rules([
+ 'image' => ['img', 'src']
+ ])->query()->getData(function ($item) {
+ return $item;
+ });
+ $items = $data->all();
+ if (!$items) return $html;
+ $orig = [];
+ $replace = [];
+ foreach ($items as $r) {
+ if (!isset($r['image']) || !$r['image']) continue;
+ $file = self::downloadCreate($r['image'], $project_key, $issue_id, $field, $tag, $userinfo);
+ if (!$file) continue;
+ $replace[] = self::$IMGURL . '/' . $file->index;
+ $orig[] = $r['image'];
+ }
+ if ($replace) {
+ $html = str_replace($orig, $replace, $html);
+ }
+ return $html;
+ }
+
+ static function html2md($html)
+ {
+ $converter = new HtmlConverter();
+ $markdown = $converter->convert($html);
+ return $markdown;
+ }
+}
diff --git a/app/Models/Issue.php b/app/Models/Issue.php
new file mode 100755
index 000000000..e006c6083
--- /dev/null
+++ b/app/Models/Issue.php
@@ -0,0 +1,566 @@
+abb = $abb;
+ $item = DB::collection('config_type')->where('project_key', $this->project_key)->where('abb', $abb)->first();
+ if ($item) {
+ $this->abb_id = $item['_id']->__toString();
+ }
+ return $this;
+ }
+
+ //设置project_key
+ public function setProjectKey($project_key)
+ {
+ $this->project_key = $project_key;
+ $this->modules = new Modules($this->project_key);
+ return $this;
+ }
+
+ //设置parent_id
+ public function setPrentId($parent_id)
+ {
+ $this->parent_id = $parent_id;
+ return $this;
+ }
+
+ //设置判断药品是否已存在的字段,默认是barcode
+ public function setMainFild($fild)
+ {
+ $this->mail_field = $fild;
+ return $this;
+ }
+
+
+
+ //获取字段
+ public function getField($key)
+ {
+ $_key = $this->project_key . "_" . $key;
+
+ if (isset($this->_CACHE[$_key]) && $this->_CACHE[$_key]) {
+ $item = $this->_CACHE[$_key];
+ } else {
+ $item = DB::collection('config_field')->where('project_key', $this->project_key)->where('key', $key)->first();
+ if (!$item) return false;
+ $item['id'] = $item['_id']->__toString();
+ $this->_CACHE[$_key] = $item;
+ }
+ return $item;
+ }
+
+ public function get_this_class_methods($class)
+ {
+ $array1 = get_class_methods($class);
+ if ($parent_class = get_parent_class($class)) {
+ $array2 = get_class_methods($parent_class);
+ $array3 = array_diff($array1, $array2);
+ } else {
+ $array3 = $array1;
+ }
+ return $array3;
+ }
+
+
+
+ /**
+ * 通过条形码获取主任务
+ */
+ public function findByBarcode($code, $parent_id = null, $ext = [], $is_del = null, $orderby = null, $field = null)
+ {
+ $methods = ['where', 'orWhere', 'whereIn', 'whereNotIn', 'whereBetween', 'whereNull', 'whereNotNull'];
+ if (is_null($field) || !$field) $field = $this->mail_field;
+ if ($field == 'barcode') { //条码处理
+ $code = intval($code);
+ }
+ if (!$this->abb_id) {
+ $item = DB::collection('issue_' . $this->project_key);
+ } else {
+ $item = DB::collection('issue_' . $this->project_key)->where('type', $this->abb_id);
+ }
+ $item = $item->where($field, $code);
+ // if(in_array( $field, ['icp','icpno'])){ //icp的并行处理
+ // $item = $item->where($field, $code)->orWhere(($field=='icp'?'icpno':'icp'),$code);
+ // }else{
+ // $item = $item->where($field, $code);
+ // }
+
+ if ($ext) {
+ foreach ($ext as $k => $v) {
+ $meth = 'where';
+ if (strpos($k, '@') === 0 && strpos($k, '_')) { //针对@whereNotNull_key 等情况
+ $keys = explode("_", $k);
+ $k = $keys[1];
+ $methx = str_replace('@', '', $keys[0]);
+ if (in_array($methx, $methods)) {
+ $meth = $methx;
+ }
+ }
+ if (in_array($meth, ['whereNull', 'whereNotNull'])) {
+ $item = $item->$meth($k);
+ } else {
+ $item = $item->$meth($k, $v);
+ }
+ }
+ }
+
+ $item = is_null($parent_id) ? $item->whereNull('parent_id') : $item->whereNotNull('parent_id');
+ $item = is_null($is_del) ? $item->whereNull('del_flg') : $item->whereNotNull('del_flg');
+ if (!$orderby) {
+ $item = $item->first();
+ } else {
+ $orate = 'asc';
+ if (is_array($orderby)) {
+ $okey = $orderby[0];
+ if (isset($orderby[1]) && in_array(strtolower($orderby[1]), ['asc', 'desc'])) {
+ $orate = strtolower($orderby[1]);
+ }
+ } else {
+ $okey = $orderby;
+ }
+ $item = $item->orderBy($okey, $orate)->first();
+ }
+ return $item;
+ }
+
+
+
+
+ public function inputFlow($data, $default_user = '')
+ {
+ if (!$data) {
+ $this->error = '内容不能为空。';
+ return false;
+ }
+
+ $new_fields = [];
+ $fields = Provider::getFieldList($this->project_key);
+
+ foreach ($fields as $field) {
+ if ($field->type !== 'File') {
+ $new_fields[$field->key] = $field->name;
+ }
+ }
+
+ $new_fields['type'] = '类型';
+ $new_fields['state'] = '状态';
+ $new_fields['parent'] = '父级任务';
+ $new_fields['reporter'] = '报告者';
+ $new_fields['created_at'] = '创建时间';
+ $new_fields['updated_at'] = '更新时间';
+ $new_fields['resolver'] = '解决者';
+ $new_fields['resolved_at'] = '解决时间';
+ $new_fields['closer'] = '关闭者';
+ $new_fields['closed_at'] = '关闭时间';
+ $fields = $new_fields;
+
+
+ // get the type schema
+ $new_types = [];
+ $standard_type_ids = [];
+ $types = Provider::getTypeList($this->project_key);
+ foreach ($types as $type) {
+ $tmp = [];
+ $tmp['id'] = $type->id;
+ $tmp['name'] = $type->name;
+ $tmp['type'] = $type->type ?: 'standard';
+ $tmp['workflow'] = $type->workflow;
+ $tmp['schema'] = Provider::getSchemaByType($type->id);
+ $new_types[$type->id] = $tmp;
+ if (!isset($data['type']) || !$data['type']) {
+ if ($type->abb == $this->abb) { //置顶类型
+ $data['type'] = $type->id;
+ }
+ } else {
+ if (strlen($data['type']) < 5) {
+ if ($type->abb == strlen($data['type'])) { //置顶类型
+ $data['type'] = $type->id;
+ }
+ }
+ }
+ if ($tmp['type'] == 'standard') {
+ $standard_type_ids[] = $tmp['id'];
+ }
+ }
+ $types = $new_types;
+
+ // get the state option
+ $new_priorities = [];
+ $priorities = Provider::getPriorityOptions($this->project_key);
+ foreach ($priorities as $priority) {
+ $new_priorities[$priority['name']] = $priority['_id'];
+ }
+ $priorities = $new_priorities;
+
+ // get the state option
+ $new_states = [];
+ $states = Provider::getStateOptions($this->project_key);
+ foreach ($states as $state) {
+ $new_states[$state['name']] = $state['_id'];
+ }
+ $states = $new_states;
+
+ // get the state option
+ $new_resolutions = [];
+ $resolutions = Provider::getResolutionOptions($this->project_key);
+ foreach ($resolutions as $resolution) {
+ $new_resolutions[$resolution['name']] = $resolution['_id'];
+ }
+ $resolutions = $new_resolutions;
+
+ $value = $data;
+ $issue = [];
+ if (isset($value['title'])) $cur_title = $issue['title'] = $value['title'];
+
+ if ($types[$value['type']]['type'] === 'subtask' && (!isset($value['parent_id']) || !$value['parent_id']) && !$this->parent_id) {
+ $this->error = '父级任务列不能为空。';
+ return false;
+ } else {
+ $issue['parent_id'] = isset($value['parent_id']) ? $value['parent_id'] : $this->parent_id;
+ }
+
+
+
+ if (isset($value['priority']) && $value['priority']) {
+ $issue['priority'] = $priorities[$value['priority']];
+ }
+
+ if (isset($value['state']) && $value['state']) {
+ if (isset($states[$value['state']]) && $states[$value['state']]) {
+ $issue['state'] = $states[$value['state']];
+ $workflow = $types[$value['type']]['workflow'];
+ if (!in_array($issue['state'], $workflow['state_ids'])) {
+ unset($issue['state']);
+ }
+ }
+ }
+
+ if (isset($value['resolution']) && $value['resolution']) {
+ if (!isset($resolutions[$value['resolution']]) || !$resolutions[$value['resolution']]) {
+ unset($issue['resolution']);
+ } else {
+ $issue['resolution'] = $resolutions[$value['resolution']];
+ }
+ }
+
+ $user_relate_fields = ['assignee' => '负责人', 'reporter' => '报告者', 'resolver' => '解决者', 'closer' => '关闭时间'];
+ foreach ($user_relate_fields as $uk => $uv) {
+ if (isset($value[$uk]) && $value[$uk]) {
+ $tmp_user = EloquentUser::where('first_name', $value[$uk])->first();
+ if (!$tmp_user) {
+ unset($value[$uk]);
+ } else {
+ $issue[$uk] = ['id' => $tmp_user->id, 'name' => $tmp_user->first_name, 'email' => $tmp_user->email];
+ if ($uk == 'resolver') {
+ $issue['his_resolvers'] = [$tmp_user->id];
+ }
+ }
+ }
+ }
+
+ $time_relate_fields = ['created_at' => '创建时间', 'resolved_at' => '解决时间', 'closed_at' => '关闭时间', 'updated_at' => '更新时间'];
+ foreach ($time_relate_fields as $tk => $tv) {
+ if (isset($value[$tk]) && $value[$tk]) {
+ $stamptime = strtotime($value[$tk]);
+ if ($stamptime === false) {
+ unset($issue[$tk]);
+ } else {
+ $issue[$tk] = $stamptime;
+ }
+ }
+ }
+
+ $schema = $types[$value['type']]['schema'];
+ foreach ($schema as $field) {
+ if (isset($field['required']) && $field['required'] && (!isset($value[$field['key']]) || !$value[$field['key']])) {
+ $this->error = $fields[$field['key']] . '列值不能为空。';
+ return false;
+ }
+ if (isset($value[$field['key']]) && $value[$field['key']]) {
+ $field_key = $field['key'];
+ $field_value = $value[$field['key']];
+ } else {
+ continue;
+ }
+
+ if (in_array($field_key, ['priority', 'resolution', 'assignee'])) {
+ continue;
+ }
+
+ if ($field_key == 'labels') {
+ $issue['labels'] = [];
+ foreach (explode(',', $field_value) as $val) {
+ if (trim($val)) {
+ $issue['labels'][] = trim($val);
+ }
+ }
+ $issue['labels'] = array_values(array_unique($issue['labels']));
+ } else if ($field['type'] === 'SingleUser' || $field_key === 'assignee') {
+ $tmp_user = EloquentUser::where('first_name', $field_value)->first();
+ if (!$tmp_user) {
+ $this->error = $fields[$field_key] . '列用户不存在。';
+ return false;
+ } else {
+ $issue[$field_key] = ['id' => $tmp_user->id, 'name' => $tmp_user->first_name, 'email' => $tmp_user->email];
+ }
+ } else if ($field['type'] === 'MultiUser') {
+ $issue[$field_key] = [];
+ $issue[$field_key . '_ids'] = [];
+ foreach (explode(',', $field_value) as $val) {
+ if (!trim($val)) {
+ continue;
+ }
+
+ $tmp_user = EloquentUser::where('first_name', trim($val))->first();
+ if (!$tmp_user) {
+ $this->error = $fields[$field_key] . '列用户不存在。';
+ return false;
+ } else if (!in_array($tmp_user->id, $issue[$field_key . '_ids'])) {
+ $issue[$field_key][] = ['id' => $tmp_user->id, 'name' => $tmp_user->first_name, 'email' => $tmp_user->email];
+ $issue[$field_key . '_ids'][] = $tmp_user->id;
+ }
+ }
+ } else if (in_array($field['type'], ['Select', 'RadioGroup', 'SingleVersion'])) {
+ foreach ($field['optionValues'] as $val) {
+ if ($val['name'] === $field_value) {
+ $issue[$field_key] = $val['id'];
+ break;
+ }
+ }
+ if (!isset($issue[$field_key]) && $field['optionValues']) {
+ $this->error = $fields[$field_key] . '列值匹配失败。';
+ return false;
+ }
+ } else if (in_array($field['type'], ['MultiSelect', 'CheckboxGroup', 'MultiVersion'])) {
+ $issue[$field_key] = [];
+ foreach (explode(',', $field_value) as $val) {
+ $val = trim($val);
+ if (!$val) {
+ continue;
+ }
+
+ $isMatched = false;
+ foreach ($field['optionValues'] as $val2) {
+ if ($val2['name'] === $val) {
+ $issue[$field_key][] = $val2['id'];
+ $isMatched = true;
+ break;
+ }
+ }
+ if (!$isMatched && $field['optionValues']) {
+ $this->error = $fields[$field_key] . '列值匹配失败。';
+ return false;
+ }
+ }
+ $issue[$field_key] = array_values(array_unique($issue[$field_key]));
+ } else if (in_array($field['type'], ['DatePicker', 'DatetimePicker'])) {
+ $stamptime = strtotime($field_value);
+ if ($stamptime === false) {
+ $this->error = $fields[$field_key] . '列值格式错误。';
+ return false;
+ } else {
+ $issue[$field_key] = $stamptime;
+ }
+ } else if ($field['type'] === 'TimeTracking') {
+ if (!$this->ttCheck($field_value)) {
+ $this->error = $fields[$field_key] . '列值格式错误。';
+ return false;
+ } else {
+ $issue[$field_key] = $this->ttHandle($field_value);
+ $issue[$field_key . '_m'] = $this->ttHandleInM($issue[$field_key]);
+ }
+ } else if ($field['type'] === 'Number') {
+ $issue[$field_key] = floatval($field_value);
+ } else {
+ $issue[$field_key] = $field_value;
+ }
+ }
+
+ $new_types = [];
+ foreach ($types as $type) {
+ $new_types[$type['id']] = $type;
+ }
+ $types = $new_types;
+
+ //模块定义
+ if (isset($value['modules']) && is_array($value['modules']) && (!isset($value['module']) || !$value['module'])) {
+ foreach ($value['modules'] as $v) {
+ $issue['module'][] = $this->modules->name2Id($v);
+ }
+ }
+
+ if (!isset($issue['type'])) $issue['type'] = $data['type'];
+ if (!isset($issue['assignee'])) {
+ $user_info = $this->userInfo($default_user);
+ $issue['assignee'] = $user_info;
+ }
+ if (!isset($issue['reporter'])) {
+ $issue['reporter'] = $issue['assignee'];
+ }
+ $this->schema = $types[$issue['type']]['schema'];
+ $this->workflow = $types[$issue['type']]['workflow'];
+ return $issue;
+ }
+
+ public function newOne($issue)
+ {
+ if (!$issue) return false;
+ $issue = $this->inputFlow($issue, $this->default_user);
+ if (!isset($issue['resolution']) || !$issue['resolution']) {
+ $issue['resolution'] = 'Unresolved';
+ }
+
+ $max_row = DB::collection('issue_' . $this->project_key)->orderBy('no', 'desc')->first();
+ $issue['no'] = $max_row ? intval($max_row['no']) + 1 : 1;
+
+ if (!isset($issue['created_at']) || !$issue['created_at']) {
+ $issue['created_at'] = time();
+ }
+ if (!isset($issue['updated_at']) || !$issue['updated_at']) {
+ $issue['updated_at'] = time();
+ }
+
+ if (!isset($issue['state']) || !$issue['state']) {
+ if (isset($issue['type'])) {
+ $wf = $this->initializeWorkflow($issue['type'], $this->tmp_user->_id);
+ $issue += $wf;
+ }
+ } else if (in_array($issue['state'], $this->workflow->state_ids ?: [])) {
+ $wf = $this->initializeWorkflowForImport($this->workflow, $issue['state']);
+ $issue += $wf;
+ }
+ $id = DB::collection('issue_' . $this->project_key)->insertGetId($issue);
+ $id = $id->__toString();
+ // add to histroy table
+ Provider::snap2His($this->project_key, $id, $this->schema);
+ // trigger event of issue created
+ Event::dispatch(new IssueEvent($this->project_key, $id, $issue['reporter'], ['event_key' => 'create_issue']));
+
+ if (isset($issue['labels']) && $issue['labels']) {
+ $this->createLabels($this->project_key, $issue['labels']);
+ }
+ return $id;
+ }
+
+ public function updateOne($id, $issue)
+ {
+ $issue = $this->inputFlow($issue, $this->default_user);
+ if (!isset($issue['updated_at']) || !$issue['updated_at']) {
+ $issue['updated_at'] = time();
+ }
+ DB::collection('issue_' . $this->project_key)->where('_id', $id)->update($issue);
+ // add to histroy table
+ $snap_id = Provider::snap2His($this->project_key, $id, $this->schema, array_keys($issue));
+ // trigger event of issue edited
+ if (isset($issue['reporter'])) Event::dispatch(new IssueEvent($this->project_key, $id, $issue['reporter'], ['event_key' => 'edit_issue', 'snap_id' => $snap_id]));
+ return $id;
+ }
+
+
+ public function createLabels($project_key, $labels)
+ {
+ $created_labels = [];
+ $project_labels = Labels::where('project_key', $project_key)
+ ->whereIn('name', $labels)
+ ->get();
+ foreach ($project_labels as $label) {
+ $created_labels[] = $label->name;
+ }
+ // get uncreated labels
+ $new_labels = array_diff($labels, $created_labels);
+ foreach ($new_labels as $label) {
+ Labels::create(['project_key' => $project_key, 'name' => $label]);
+ }
+ return true;
+ }
+
+ public function userInfo($val)
+ {
+ $tmp_user = '';
+ if ($val) {
+ $tmp_user = EloquentUser::where('first_name', trim($val))->first();
+ }
+ if (!$tmp_user) {
+ $tmp_user = EloquentUser::orderBy('crated_at', 'asc')->first();
+ }
+ $this->tmp_user = $tmp_user;
+ $ret = ['id' => $tmp_user->id, 'name' => $tmp_user->first_name, 'email' => $tmp_user->email];
+ return $ret;
+ }
+
+
+ public function initializeWorkflow($type, $userid)
+ {
+ // get workflow definition
+ $wf_definition = Provider::getWorkflowByType($type);
+ // create and start workflow instacne
+ $wf_entry = Workflow::createInstance($wf_definition->id, $userid)->start(['caller' => $userid]);
+ // get the inital step
+ $initial_step = $wf_entry->getCurrentSteps()->first();
+ $initial_state = $wf_entry->getStepMeta($initial_step->step_id, 'state');
+
+ $ret['state'] = $initial_state;
+ //$ret['resolution'] = 'Unresolved';
+ $ret['entry_id'] = $wf_entry->getEntryId();
+ $ret['definition_id'] = $wf_definition->id;
+ return $ret;
+ }
+
+ /**
+ * initialize the workflow for the issue import.
+ *
+ * @param object $wf_definition
+ * @param string $state
+ * @return array
+ */
+ public function initializeWorkflowForImport($wf_definition, $state, $user)
+ {
+ // create and start workflow instacne
+ $wf_entry = Workflow::createInstance($wf_definition->id, $user->_id);
+
+ $wf_contents = $wf_definition->contents ?: [];
+ $steps = isset($wf_contents['steps']) && $wf_contents['steps'] ? $wf_contents['steps'] : [];
+
+ $fake_step = [];
+ foreach ($steps as $step) {
+ if (isset($step['state']) && $step['state'] == $state) {
+ $fake_step = $step;
+ break;
+ }
+ }
+ if (!$fake_step) {
+ return [];
+ }
+
+ $caller = ['id' => $user->_id, 'name' => $user->first_name, 'email' => $user->email];
+ $wf_entry->fakeNewCurrentStep($fake_step, $caller);
+
+ $ret['entry_id'] = $wf_entry->getEntryId();
+ $ret['definition_id'] = $wf_definition->id;
+
+ return $ret;
+ }
+}
diff --git a/app/Models/Sentinel.php b/app/Models/Sentinel.php
new file mode 100644
index 000000000..2027d81d7
--- /dev/null
+++ b/app/Models/Sentinel.php
@@ -0,0 +1,13 @@
+getUserId();
+ }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
new file mode 100644
index 000000000..804799baf
--- /dev/null
+++ b/app/Models/User.php
@@ -0,0 +1,43 @@
+ 'datetime',
+ ];
+}
diff --git a/app/Policies/.gitkeep b/app/Policies/.gitkeep
old mode 100644
new mode 100755
diff --git a/app/Project/Eloquent/AccessBoardLog.php b/app/Project/Eloquent/AccessBoardLog.php
old mode 100644
new mode 100755
diff --git a/app/Project/Eloquent/AccessProjectLog.php b/app/Project/Eloquent/AccessProjectLog.php
old mode 100644
new mode 100755
diff --git a/app/Project/Eloquent/Board.php b/app/Project/Eloquent/Board.php
old mode 100644
new mode 100755
diff --git a/app/Project/Eloquent/BoardRankMap.php b/app/Project/Eloquent/BoardRankMap.php
old mode 100644
new mode 100755
diff --git a/app/Project/Eloquent/DocumentFavorites.php b/app/Project/Eloquent/DocumentFavorites.php
new file mode 100755
index 000000000..7fb318822
--- /dev/null
+++ b/app/Project/Eloquent/DocumentFavorites.php
@@ -0,0 +1,17 @@
+remote) && $file->remote && isset($file->download_flg) && $file->download_flg!=1){
+ return true;
+ }
+ return false;
+
+ }
}
diff --git a/app/Project/Eloquent/GroupProject.php b/app/Project/Eloquent/GroupProject.php
old mode 100644
new mode 100755
diff --git a/app/Project/Eloquent/IssueFilters.php b/app/Project/Eloquent/IssueFilters.php
new file mode 100755
index 000000000..279f5484b
--- /dev/null
+++ b/app/Project/Eloquent/IssueFilters.php
@@ -0,0 +1,19 @@
+ 'assigned_to_me', 'name' => '分配给我的', 'query' => [ 'assignee' => 'me', 'resolution' => 'Unresolved' ] ],
[ 'id' => 'watched', 'name' => '我关注的', 'query' => [ 'watcher' => 'me' ] ],
[ 'id' => 'reported', 'name' => '我报告的', 'query' => [ 'reporter' => 'me' ] ],
- [ 'id' => 'recent_created', 'name' => '最近增加的', 'query' => [ 'created_at' => '2w' ] ],
- [ 'id' => 'recent_updated', 'name' => '最近更新的', 'query' => [ 'updated_at' => '2w' ] ],
- [ 'id' => 'recent_resolved', 'name' => '最近解决的', 'query' => [ 'resolved_at' => '2w' ] ],
- [ 'id' => 'recent_closed', 'name' => '最近关闭的', 'query' => [ 'closed_at' => '2w' ] ],
+ [ 'id' => 'recent_created', 'name' => '最近新建的', 'query' => [ 'created_at' => '-14d~' ] ],
+ [ 'id' => 'recent_updated', 'name' => '最近更新的', 'query' => [ 'updated_at' => '-14d~' ] ],
+ [ 'id' => 'recent_resolved', 'name' => '最近解决的', 'query' => [ 'resolved_at' => '-14d~' ] ],
+ [ 'id' => 'recent_closed', 'name' => '最近关闭的', 'query' => [ 'closed_at' => '-14d~' ] ],
];
}
@@ -78,13 +79,35 @@ public static function getIssueFilters($project_key, $user_id)
// default issue filters
$filters = self::getDefaultIssueFilters();
+ // customize the filter
+ $customize_filters = IssueFilters::where('project_key', $project_key)
+ ->where(function ($query) use ($user_id) {
+ $query->where('creator', $user_id)
+ ->orWhere('scope', 'public');
+ })
+ ->get();
+ foreach ($customize_filters as $val)
+ {
+ $filters[] = [ 'id' => $val->id, 'name' => $val->name ?: '', 'query' => $val->query ?: [], 'creator' => $val->creator ];
+ }
+
+ $sequence = [];
$res = UserIssueFilters::where('project_key', $project_key)
->where('user', $user_id)
- ->first();
+ ->first();
if ($res)
{
- $filters = isset($res->filters) ? $res->filters : [];
+ $sequence = isset($res->sequence) ? $res->sequence : [];
+ $func = function($v1, $v2) use ($sequence) {
+ $i1 = array_search($v1['id'], $sequence);
+ $i1 = $i1 !== false ? $i1 : 998;
+ $i2 = array_search($v2['id'], $sequence);
+ $i2 = $i2 !== false ? $i2 : 999;
+ return $i1 >= $i2 ? 1 : -1;
+ };
+ usort($filters, $func);
}
+
return $filters;
}
@@ -205,7 +228,7 @@ public static function getLabelOptions($project_key)
->get();
foreach ($labels as $label)
{
- $options[] = $label->name;
+ $options[] = [ 'name' => $label->name, 'bgColor' => $label->bgColor ?: '' ];
}
return $options;
@@ -632,7 +655,7 @@ public static function getAssignedUsers($project_key)
public static function getVersionList($project_key, $fields=[])
{
$versions = Version::where([ 'project_key' => $project_key ])
- ->orderBy('status', 'asc')
+ ->orderBy('status', 'desc')
->orderBy('released_time', 'desc')
->orderBy('end_time', 'desc')
->orderBy('created_at', 'desc')
@@ -855,7 +878,7 @@ private static function _repairSchema($project_key, $issue_type, $schema, $optio
$couple_labels = [];
foreach ($options['labels'] as $label)
{
- $couple_labels[] = [ 'id' => $label, 'name' => $label ];
+ $couple_labels[] = [ 'id' => $label['name'], 'name' => $label['name'] ];
}
$val['optionValues'] = $couple_labels;
}
@@ -1046,7 +1069,7 @@ public static function getScreenSchema($project_key, $type_id, $screen)
$couple_labels = [];
foreach ($labels as $label)
{
- $couple_labels[] = [ 'id' => $label, 'name' => $label ];
+ $couple_labels[] = [ 'id' => $label['name'], 'name' => $label['name'] ];
}
$val['optionValues'] = $couple_labels;
}
@@ -1106,7 +1129,7 @@ public static function snap2His($project_key, $issue_id, $schema = [], $change_f
$schema = [];
if ($change_fields)
{
- $out_schema_fields = [ 'type', 'state', 'resolution', 'priority', 'assignee', 'labels', 'parent_id', 'progress', 'expect_start_time', 'expect_complete_time' ];
+ $out_schema_fields = [ 'type', 'state', 'resolution', 'priority', 'assignee', 'descriptions', 'labels', 'parent_id', 'progress', 'expect_start_time', 'expect_complete_time' ];
if (array_diff($change_fields, $out_schema_fields))
{
$schema = self::getSchemaByType($issue['type']);
@@ -1120,77 +1143,77 @@ public static function snap2His($project_key, $issue_id, $schema = [], $change_f
foreach ($schema as $field)
{
- if (in_array($field['key'], [ 'assignee', 'progress' ]) || ($change_fields && !in_array($field['key'], $change_fields)))
+ if (!isset($issue[$field['key']]) || ($change_fields && !in_array($field['key'], $change_fields)))
{
continue;
}
- if (isset($issue[$field['key']]))
- {
- $val = [];
- $val['name'] = $field['name'];
+ $val = [];
+ $val['name'] = $field['name'];
- if ($field['type'] === 'SingleUser' || $field['type'] === 'MultiUser')
+ if ($field['type'] === 'SingleUser' || $field['type'] === 'MultiUser')
+ {
+ if ($field['type'] === 'SingleUser')
{
- if ($field['type'] === 'SingleUser')
- {
- $val['value'] = $issue[$field['key']] ? $issue[$field['key']]['name'] : $issue[$field['key']];
- }
- else
- {
- $tmp_users = [];
- if ($issue[$field['key']])
- {
- foreach ($issue[$field['key']] as $tmp_user)
- {
- $tmp_users[] = $tmp_user['name'];
- }
- }
- $val['value'] = implode(',', $tmp_users);
- }
+ $val['value'] = $issue[$field['key']] ? $issue[$field['key']]['name'] : $issue[$field['key']];
}
- else if (isset($field['optionValues']) && $field['optionValues'])
+ else
{
- $opv = [];
-
- if (!is_array($issue[$field['key']]))
- {
- $fieldValues = explode(',', $issue[$field['key']]);
- }
- else
+ $tmp_users = [];
+ if ($issue[$field['key']])
{
- $fieldValues = $issue[$field['key']];
- }
- foreach ($field['optionValues'] as $ov)
- {
- if (in_array($ov['id'], $fieldValues))
+ foreach ($issue[$field['key']] as $tmp_user)
{
- $opv[] = $ov['name'];
+ $tmp_users[] = $tmp_user['name'];
}
}
- $val['value'] = implode(',', $opv);
+ $val['value'] = implode(',', $tmp_users);
}
- else if ($field['type'] == 'File')
+ }
+ else if (isset($field['optionValues']) && $field['optionValues'])
+ {
+ $opv = [];
+
+ if (!is_array($issue[$field['key']]))
{
- $val['value'] = [];
- foreach ($issue[$field['key']] as $fid)
- {
- $file = File::find($fid);
- array_push($val['value'], $file->name);
- }
+ $fieldValues = explode(',', $issue[$field['key']]);
}
- else if ($field['type'] == 'DatePicker' || $field['type'] == 'DateTimePicker')
+ else
{
- $val['value'] = $issue[$field['key']] ? date($field['type'] == 'DatePicker' ? 'Y/m/d' : 'Y/m/d H:i:s', $issue[$field['key']]) : $issue[$field['key']];
+ $fieldValues = $issue[$field['key']];
}
- else
+ foreach ($field['optionValues'] as $ov)
{
- $val['value'] = $issue[$field['key']];
+ if (in_array($ov['id'], $fieldValues))
+ {
+ $opv[] = $ov['name'];
+ }
}
- //$val['type'] = $field['type'];
-
- $snap_data[$field['key']] = $val;
+ $val['value'] = implode(',', $opv);
+ }
+ else if ($field['type'] == 'File')
+ {
+ $val['value'] = [];
+ foreach ($issue[$field['key']] as $fid)
+ {
+ $file = File::find($fid);
+ array_push($val['value'], $file->name);
+ }
+ }
+ else if ($field['type'] == 'DatePicker' || $field['type'] == 'DateTimePicker')
+ {
+ $val['value'] = $issue[$field['key']] ? date($field['type'] == 'DatePicker' ? 'Y/m/d' : 'Y/m/d H:i:s', $issue[$field['key']]) : $issue[$field['key']];
}
+ else if ($field['key'] == 'progress')
+ {
+ $val['value'] = $issue[$field['key']] . '%';
+ }
+ else
+ {
+ $val['value'] = $issue[$field['key']];
+ }
+
+ $snap_data[$field['key']] = $val;
}
// special fields handle
@@ -1254,14 +1277,30 @@ public static function snap2His($project_key, $issue_id, $schema = [], $change_f
{
if (in_array('assignee', $change_fields) || !isset($snap_data['assignee']))
{
- $snap_data['assignee'] = [ 'value' => $issue['assignee']['name'], 'name' => '经办人' ];
+ $snap_data['assignee'] = [ 'value' => $issue['assignee']['name'], 'name' => '负责人' ];
+ }
+ }
+ else
+ {
+ $snap_data['assignee'] = [ 'value' => '', 'name' => '负责人' ];
+ }
+ }
+
+ if (isset($issue['descriptions']))
+ {
+ if ($issue['descriptions'])
+ {
+ if (in_array('descriptions', $change_fields) || !isset($snap_data['descriptions']))
+ {
+ $snap_data['descriptions'] = [ 'value' => $issue['descriptions'], 'name' => '描述' ];
}
}
else
{
- $snap_data['assignee'] = [ 'value' => '', 'name' => '经办人' ];
+ $snap_data['descriptions'] = [ 'value' => '', 'name' => '描述' ];
}
}
+
// labels
if (isset($issue['labels']))
{
@@ -1321,7 +1360,7 @@ public static function snap2His($project_key, $issue_id, $schema = [], $change_f
}
else
{
- $snap_data['expect_start_time'] = [ 'value' => date('Y/m/d', $issue['expect_start_time']), 'name' => '期望开始时间' ];
+ $snap_data['expect_start_time'] = [ 'value' => '', 'name' => '期望开始时间' ];
}
}
@@ -1433,13 +1472,37 @@ public static function isEpicExisted($project_key, $name)
*/
public static function getSprintList($project_key, $fields=[])
{
- $epics = Sprint::Where('project_key', $project_key)
+ $sprints = Sprint::Where('project_key', $project_key)
->WhereIn('status', [ 'active', 'completed' ])
->orderBy('no', 'desc')
->get($fields)
->toArray();
- return $epics;
+ foreach($sprints as $key => $sprint)
+ {
+ if (!isset($sprint['name']))
+ {
+ $sprints[$key]['name'] = 'Sprint ' . $sprint['no'];
+ }
+ }
+
+ return $sprints;
+ }
+
+ /**
+ * check if Label has existed.
+ *
+ * @param string $project_key
+ * @param string $name
+ * @return bool
+ */
+ public static function isLabelExisted($project_key, $name)
+ {
+ $isExisted = Labels::Where('project_key', $project_key)
+ ->Where('name', $name)
+ ->exists();
+
+ return $isExisted;
}
}
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 35471f6ff..ee8ca5bcd 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -7,21 +7,21 @@
class AppServiceProvider extends ServiceProvider
{
/**
- * Bootstrap any application services.
+ * Register any application services.
*
* @return void
*/
- public function boot()
+ public function register()
{
//
}
/**
- * Register any application services.
+ * Bootstrap any application services.
*
* @return void
*/
- public function register()
+ public function boot()
{
//
}
diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php
index 57d88ea3f..ce7449164 100644
--- a/app/Providers/AuthServiceProvider.php
+++ b/app/Providers/AuthServiceProvider.php
@@ -2,8 +2,8 @@
namespace App\Providers;
-use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
+use Illuminate\Support\Facades\Gate;
class AuthServiceProvider extends ServiceProvider
{
@@ -13,18 +13,17 @@ class AuthServiceProvider extends ServiceProvider
* @var array
*/
protected $policies = [
- 'App\Model' => 'App\Policies\ModelPolicy',
+ // 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
- * Register any application authentication / authorization services.
+ * Register any authentication / authorization services.
*
- * @param \Illuminate\Contracts\Auth\Access\Gate $gate
* @return void
*/
- public function boot(GateContract $gate)
+ public function boot()
{
- $this->registerPolicies($gate);
+ $this->registerPolicies();
//
}
diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php
new file mode 100644
index 000000000..395c518bc
--- /dev/null
+++ b/app/Providers/BroadcastServiceProvider.php
@@ -0,0 +1,21 @@
+ [
- 'App\Listeners\FieldConfigChangeListener',
+ Registered::class => [
+ SendEmailVerificationNotification::class,
],
- 'App\Events\FieldDeleteEvent' => [
- 'App\Listeners\FieldConfigChangeListener',
- ],
- 'App\Events\ResolutionConfigChangeEvent' => [
- 'App\Listeners\PropertyConfigChangeListener',
- ],
- 'App\Events\PriorityConfigChangeEvent' => [
- 'App\Listeners\PropertyConfigChangeListener',
- ],
- 'App\Events\AddUserToRoleEvent' => [
- 'App\Listeners\UserRoleSetListener',
- ],
- 'App\Events\DelUserFromRoleEvent' => [
- 'App\Listeners\UserRoleSetListener',
- ],
- 'App\Events\DelUserEvent' => [
- 'App\Listeners\UserDelListener'
- ],
- 'App\Events\AddGroupToRoleEvent' => [
- 'App\Listeners\GroupRoleSetListener',
- ],
- 'App\Events\DelGroupFromRoleEvent' => [
- 'App\Listeners\GroupRoleSetListener',
- ],
- 'App\Events\DelGroupEvent' => [
- 'App\Listeners\GroupDelListener'
- ],
- 'App\Events\FileUploadEvent' => [
- 'App\Listeners\FileChangeListener',
- 'App\Listeners\ActivityAddListener',
- ],
- 'App\Events\FileDelEvent' => [
- 'App\Listeners\FileChangeListener',
+ 'App\Events\IssueEvent' => [
'App\Listeners\ActivityAddListener',
],
- 'App\Events\IssueEvent' => [
- 'App\Listeners\ActivityAddListener',
- 'App\Listeners\WebhooksRequestListener',
- ],
- 'App\Events\VersionEvent' => [
- 'App\Listeners\ActivityAddListener',
- 'App\Listeners\WebhooksRequestListener',
- ],
- 'App\Events\SprintEvent' => [
- 'App\Listeners\ActivityAddListener',
- ],
- 'App\Events\WikiEvent' => [
- 'App\Listeners\ActivityAddListener',
- ],
- 'App\Events\ModuleEvent' => [
- 'App\Listeners\ActivityAddListener',
- //'App\Listeners\WebhooksRequestListener',
- ],
];
/**
- * Register any other events for your application.
+ * Register any events for your application.
*
- * @param \Illuminate\Contracts\Events\Dispatcher $events
* @return void
*/
- public function boot(DispatcherContract $events)
+ public function boot()
{
- parent::boot($events);
-
//
}
}
diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
index bde08819a..927be5d7e 100644
--- a/app/Providers/RouteServiceProvider.php
+++ b/app/Providers/RouteServiceProvider.php
@@ -2,60 +2,62 @@
namespace App\Providers;
-use Illuminate\Routing\Router;
+use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\RateLimiter;
+use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
- * This namespace is applied to your controller routes.
+ * The path to the "home" route for your application.
*
- * In addition, it is set as the URL generator's root namespace.
+ * This is used by Laravel authentication to redirect users after login.
*
* @var string
*/
- protected $namespace = 'App\Http\Controllers';
+ public const HOME = '/home';
/**
- * Define your route model bindings, pattern filters, etc.
+ * The controller namespace for the application.
*
- * @param \Illuminate\Routing\Router $router
- * @return void
+ * When present, controller route declarations will automatically be prefixed with this namespace.
+ *
+ * @var string|null
*/
- public function boot(Router $router)
- {
- //
-
- parent::boot($router);
- }
+ protected $namespace = 'App\\Http\\Controllers';
/**
- * Define the routes for the application.
+ * Define your route model bindings, pattern filters, etc.
*
- * @param \Illuminate\Routing\Router $router
* @return void
*/
- public function map(Router $router)
+ public function boot()
{
- $this->mapWebRoutes($router);
+ $this->configureRateLimiting();
+
+ $this->routes(function () {
+ Route::prefix('api')
+ ->middleware('api')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/api.php'));
- //
+ Route::middleware('web')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/web.php'));
+ });
}
/**
- * Define the "web" routes for the application.
- *
- * These routes all receive session state, CSRF protection, etc.
+ * Configure the rate limiters for the application.
*
- * @param \Illuminate\Routing\Router $router
* @return void
*/
- protected function mapWebRoutes(Router $router)
+ protected function configureRateLimiting()
{
- $router->group([
- 'namespace' => $this->namespace, 'middleware' => 'web',
- ], function ($router) {
- require app_path('Http/routes.php');
+ RateLimiter::for('api', function (Request $request) {
+ return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}
}
diff --git a/app/System/Eloquent/ApiAccessLogs.php b/app/System/Eloquent/ApiAccessLogs.php
old mode 100644
new mode 100755
diff --git a/app/System/Eloquent/CalendarSingular.php b/app/System/Eloquent/CalendarSingular.php
old mode 100644
new mode 100755
diff --git a/app/System/Eloquent/ResetPwdCode.php b/app/System/Eloquent/ResetPwdCode.php
old mode 100644
new mode 100755
diff --git a/app/System/Eloquent/SysSetting.php b/app/System/Eloquent/SysSetting.php
old mode 100644
new mode 100755
diff --git a/app/System/Eloquent/UserSetting.php b/app/System/Eloquent/UserSetting.php
old mode 100644
new mode 100755
diff --git a/app/User.php b/app/User.php
deleted file mode 100644
index 75741ae42..000000000
--- a/app/User.php
+++ /dev/null
@@ -1,26 +0,0 @@
-insert([ 'contents' => $comments, 'atWho' => [], 'issue_id' => $issue_id, 'creator' => $creator, 'created_at' => time() ]);
// trigger event of comments added
- Event::fire(new IssueEvent($project_key, $issue_id, $creator, [ 'event_key' => 'add_comments', 'data' => [ 'contents' => $comments, 'atWho' => [] ] ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $creator, [ 'event_key' => 'add_comments', 'data' => [ 'contents' => $comments, 'atWho' => [] ] ]));
}
/**
@@ -254,10 +254,10 @@ public static function updIssue($param)
// snap to history
$snap_id = Provider::snap2His($project_key, $issue_id, null, array_keys(self::$issue_properties));
- if (!isset($param['eventParam']) || !$param['eventParam'])
- {
- Event::fire(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'normal', 'snap_id' => $snap_id ]));
- }
+ //if (!isset($param['eventParam']) || !$param['eventParam'])
+ //{
+ // Event::dispatch(new IssueEvent($project_key, $issue_id, $updValues['modifier'], [ 'event_key' => 'normal', 'snap_id' => $snap_id ]));
+ //}
self::$snap_id = $snap_id;
}
@@ -273,17 +273,18 @@ public static function triggerEvent($param)
{
$issue_id = $param['issue_id'];
$project_key = $param['project_key'];
+ $event_key = array_get($param, 'eventParam', 'normal');
$user_info = Sentinel::findById($param['caller']);
$caller = [ 'id' => $user_info->id, 'name' => $user_info->first_name, 'email' => $user_info->email ];
- if (isset(self::$snap_id) && self::$snap_id)
+ if (self::$snap_id)
{
- Event::fire(new IssueEvent($project_key, $issue_id, $caller, [ 'event_key' => $param['eventParam'], 'snap_id' => self::$snap_id ]));
+ Event::dispatch(new IssueEvent($project_key, $issue_id, $caller, [ 'event_key' => $event_key, 'snap_id' => self::$snap_id ]));
}
$updValues = [];
- if ($param['eventParam'] === 'resolve_issue')
+ if ($event_key === 'resolve_issue')
{
$updValues['resolved_at'] = time();
$updValues['resolver'] = $caller;
@@ -316,7 +317,7 @@ public static function triggerEvent($param)
}
$updValues['his_resolvers'] = array_unique($his_resolvers);
}
- else if ($param['eventParam'] === 'close_issue')
+ else if ($event_key === 'close_issue')
{
$updValues['closed_at'] = time();
$updValues['closer'] = $caller;
diff --git a/app/Workflow/Util.php b/app/Workflow/Util.php
old mode 100644
new mode 100755
diff --git a/app/Workflow/Workflow.php b/app/Workflow/Workflow.php
old mode 100644
new mode 100755
diff --git a/app/Workflow/workflow-new.json b/app/Workflow/workflow-new.json
old mode 100644
new mode 100755
diff --git a/app/Workflow/workflow.json b/app/Workflow/workflow.json
old mode 100644
new mode 100755
diff --git a/app/ext.helper.php b/app/ext.helper.php
new file mode 100644
index 000000000..af4f46514
--- /dev/null
+++ b/app/ext.helper.php
@@ -0,0 +1,19 @@
+=5.5.9",
- "laravel/framework": "5.2.*",
- "jenssegers/mongodb": "^3.0",
- "cartalyst/sentinel": "^2.0",
- "maatwebsite/excel": "^2.1",
- "adldap2/adldap2": "^8.1",
- "chumper/zipper": "^1.0"
+ "php": "^7.3.0",
+ "laravel/framework": "^8.5",
+ "jenssegers/mongodb": "^3.8",
+ "cartalyst/sentinel": "^5.1",
+ "maatwebsite/excel": "^3.1",
+ "adldap2/adldap2": "^10.3",
+ "madnest/madzipper": "^1.0",
+ "phpoffice/phpspreadsheet": "^1.17",
+ "guzzlehttp/guzzle": ">=7.2",
+ "hprose/hprose": ">=2.0",
+ "catfan/medoo": ">=1.7",
+ "jaeger/querylist-curl-multi": "^4.0",
+ "jaeger/querylist": "4.1.1",
+ "league/html-to-markdown": "^5.0",
+ "lyhiving/quickio": "^1.0",
+ "overtrue/laravel-filesystem-cos": "^2.0",
+ "iidestiny/laravel-filesystem-oss": "^2.1",
+ "fideloper/proxy": "^4.4",
+ "barryvdh/laravel-cors": "^2.0",
+ "nunomaduro/collision": "^5.3",
+ "facade/ignition": "^2.8",
+ "laravel/ui": "^3.2",
+ "phpunit/phpunit": "^9.5",
+ "laravel/legacy-factories": "^1.1"
},
"require-dev": {
- "fzaninotto/faker": "~1.4",
- "mockery/mockery": "0.9.*",
- "phpunit/phpunit": "~4.0",
- "symfony/css-selector": "2.8.*|3.0.*",
- "symfony/dom-crawler": "2.8.*|3.0.*"
+ "fzaninotto/faker": "^1.4",
+ "mockery/mockery": "^0.9",
+ "symfony/css-selector": "^3.0",
+ "symfony/dom-crawler": "^3.0"
},
"autoload": {
+ "files": [
+ "app/laravel.helper.php",
+ "app/ext.helper.php"
+ ],
"classmap": [
"database"
],
diff --git a/composer.lock b/composer.lock
old mode 100644
new mode 100755
index f3388f69b..c30c95a9f
--- a/composer.lock
+++ b/composer.lock
@@ -1,33 +1,46 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "2a890e1af863184921a4c14d4c366081",
+ "content-hash": "d0ad76fca80ab2dea5b8f5216382f5ff",
"packages": [
{
"name": "adldap2/adldap2",
- "version": "v8.1.5",
+ "version": "v10.3.2",
"source": {
"type": "git",
"url": "https://github.com/Adldap2/Adldap2.git",
- "reference": "54722408c68f12942fcbf4a1b666d90a178ddc5c"
+ "reference": "b2203d800c5932f975abc213c659428697e27cd9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Adldap2/Adldap2/zipball/54722408c68f12942fcbf4a1b666d90a178ddc5c",
- "reference": "54722408c68f12942fcbf4a1b666d90a178ddc5c",
- "shasum": ""
+ "url": "https://api.github.com/repos/Adldap2/Adldap2/zipball/b2203d800c5932f975abc213c659428697e27cd9",
+ "reference": "b2203d800c5932f975abc213c659428697e27cd9",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
+ "ext-json": "*",
"ext-ldap": "*",
- "illuminate/support": "~5.0",
- "php": ">=5.5.9"
+ "illuminate/contracts": "~5.0|~6.0|~7.0|~8.0",
+ "php": ">=7.0",
+ "psr/log": "~1.0",
+ "psr/simple-cache": "~1.0",
+ "tightenco/collect": "~5.0|~6.0|~7.0|~8.0"
},
"require-dev": {
- "mockery/mockery": "~0.9|~1.0",
- "phpunit/phpunit": "~4.8|~5.6"
+ "mockery/mockery": "~1.0",
+ "phpunit/phpunit": "~6.0|~7.0|~8.0"
+ },
+ "suggest": {
+ "ext-fileinfo": "fileinfo is required when retrieving user encoded thumbnails"
},
"type": "library",
"autoload": {
@@ -56,256 +69,228 @@
"ldap",
"windows"
],
- "time": "2018-04-19T15:06:54+00:00"
+ "support": {
+ "docs": "https://github.com/Adldap2/Adldap2/blob/master/readme.md",
+ "email": "steven_bauman@outlook.com",
+ "issues": "https://github.com/Adldap2/Adldap2/issues",
+ "source": "https://github.com/Adldap2/Adldap2"
+ },
+ "time": "2021-03-05T21:14:57+00:00"
},
{
- "name": "cartalyst/sentinel",
- "version": "v2.0.12",
+ "name": "aliyuncs/oss-sdk-php",
+ "version": "v2.4.1",
"source": {
"type": "git",
- "url": "https://github.com/cartalyst/sentinel.git",
- "reference": "5054be235f5501c5f05aebbacdfd1971fb64b52e"
+ "url": "https://github.com/aliyun/aliyun-oss-php-sdk.git",
+ "reference": "492866331b7bafaac09506cf42f351b7e9e63766"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/cartalyst/sentinel/zipball/5054be235f5501c5f05aebbacdfd1971fb64b52e",
- "reference": "5054be235f5501c5f05aebbacdfd1971fb64b52e",
- "shasum": ""
+ "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/492866331b7bafaac09506cf42f351b7e9e63766",
+ "reference": "492866331b7bafaac09506cf42f351b7e9e63766",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "cartalyst/support": "~1.0",
- "illuminate/support": "~5.0",
- "php": ">=5.4.0"
+ "php": ">=5.3"
},
"require-dev": {
- "illuminate/cookie": "~5.0",
- "illuminate/database": "~5.0",
- "illuminate/http": "~5.0",
- "illuminate/session": "~5.0",
- "ircmaxell/password-compat": "~1.0",
- "mockery/mockery": "~0.9",
- "paragonie/random_compat": "^1.4|^2",
- "phpunit/phpunit": "~4.0"
- },
- "suggest": {
- "illuminate/database": "By default, Sentinel utilizes the powerful Illuminate database layer.",
- "illuminate/events": "To hook into various events across Sentinel, we recommend using Illuminate's event dispatcher.",
- "ircmaxell/password-compat": "Default hashing uses PHP 5.5 password_* functions, with forward-compatible support.",
- "symfony/http-foundation": "Required for native implementations."
+ "phpunit/phpunit": "~4.0",
+ "satooshi/php-coveralls": "~1.0"
},
"type": "library",
- "extra": {
- "component": "package",
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "Cartalyst\\Sentinel\\": "src/"
+ "OSS\\": "src/OSS"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Ben Corlett",
- "email": "ben.corlett@cartalyst.com",
- "role": "Developer"
- },
- {
- "name": "Cartalyst LLC",
- "email": "help@cartalyst.com"
- },
- {
- "name": "Bruno Gaspar",
- "email": "bruno.gaspar@cartalyst.com",
- "role": "Developer"
- },
- {
- "name": "Dan Syme",
- "email": "dan.syme@cartalyst.com",
- "role": "Creator & Designer"
- },
- {
- "name": "Suhayb Wardany",
- "email": "su.wardany@cartalyst.com",
- "role": "Developer"
+ "name": "Aliyuncs",
+ "homepage": "http://www.aliyun.com"
}
],
- "description": "PHP 5.4+ Fully-featured Authentication & Authorization System",
- "keywords": [
- "auth",
- "cartalyst",
- "codeigniter",
- "fuelphp",
- "laravel",
- "php",
- "security"
- ],
- "time": "2016-05-13T16:34:19+00:00"
+ "description": "Aliyun OSS SDK for PHP",
+ "homepage": "http://www.aliyun.com/product/oss/",
+ "support": {
+ "issues": "https://github.com/aliyun/aliyun-oss-php-sdk/issues",
+ "source": "https://github.com/aliyun/aliyun-oss-php-sdk/tree/v2.4.1"
+ },
+ "time": "2020-09-29T06:23:57+00:00"
},
{
- "name": "cartalyst/support",
- "version": "v1.2.0",
+ "name": "ares333/php-curl",
+ "version": "v4.6.1",
"source": {
"type": "git",
- "url": "https://github.com/cartalyst/support.git",
- "reference": "feab60d8190ccce376e67c161b5c0559574b9832"
+ "url": "https://github.com/ares333/php-curl.git",
+ "reference": "580025300c3cbf7cafe825bd454018ffc62233cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/cartalyst/support/zipball/feab60d8190ccce376e67c161b5c0559574b9832",
- "reference": "feab60d8190ccce376e67c161b5c0559574b9832",
- "shasum": ""
+ "url": "https://api.github.com/repos/ares333/php-curl/zipball/580025300c3cbf7cafe825bd454018ffc62233cf",
+ "reference": "580025300c3cbf7cafe825bd454018ffc62233cf",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.4.0"
- },
- "require-dev": {
- "illuminate/mail": "~4.1|~5.0",
- "illuminate/validation": "~4.1|~5.0",
- "mockery/mockery": "~0.9",
- "phpunit/phpunit": "~4.0"
+ "ext-curl": "*",
+ "php": ">=5.3.0"
},
"type": "library",
- "extra": {
- "component": "package",
- "branch-alias": {
- "dev-master": "1.2.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "Cartalyst\\Support\\": "src/"
+ "Ares333\\Curl\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "Apache-2.0"
],
"authors": [
{
- "name": "Cartalyst LLC",
- "email": "help@cartalyst.com"
- },
- {
- "name": "Bruno Gaspar",
- "email": "bruno.gaspar@cartalyst.com",
- "role": "Developer"
- },
- {
- "name": "Dan Syme",
- "email": "dan.syme@cartalyst.com",
- "role": "Project Lead"
- },
- {
- "name": "Suhayb Wardany",
- "email": "su.wardany@cartalyst.com",
- "role": "Developer"
+ "name": "Ares",
+ "homepage": "http://phpdr.net"
}
],
- "description": "Support helpers.",
+ "description": "The best php curl library.",
"keywords": [
- "cartalyst",
- "helper",
- "laravel",
- "support"
+ "PHP cURL",
+ "aysnc http",
+ "curl",
+ "curlmulti"
],
- "time": "2016-06-21T04:08:43+00:00"
+ "support": {
+ "issues": "https://github.com/ares333/php-curl/issues",
+ "source": "https://github.com/ares333/php-curl/tree/master"
+ },
+ "time": "2018-12-13T03:47:27+00:00"
},
{
- "name": "chumper/zipper",
- "version": "v1.0.2",
+ "name": "asm89/stack-cors",
+ "version": "v2.0.3",
"source": {
"type": "git",
- "url": "https://github.com/Chumper/Zipper.git",
- "reference": "6a1733c34d67c3952b8439afb36ad4ea5c3ceacb"
+ "url": "https://github.com/asm89/stack-cors.git",
+ "reference": "9cb795bf30988e8c96dd3c40623c48a877bc6714"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Chumper/Zipper/zipball/6a1733c34d67c3952b8439afb36ad4ea5c3ceacb",
- "reference": "6a1733c34d67c3952b8439afb36ad4ea5c3ceacb",
- "shasum": ""
+ "url": "https://api.github.com/repos/asm89/stack-cors/zipball/9cb795bf30988e8c96dd3c40623c48a877bc6714",
+ "reference": "9cb795bf30988e8c96dd3c40623c48a877bc6714",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "illuminate/filesystem": "^5.0",
- "illuminate/support": "^5.0",
- "php": ">=5.6.0"
+ "php": "^7.0|^8.0",
+ "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0",
+ "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0"
},
"require-dev": {
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^5.7"
+ "phpunit/phpunit": "^6|^7|^8|^9",
+ "squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
- "laravel": {
- "providers": [
- "Chumper\\Zipper\\ZipperServiceProvider"
- ],
- "aliases": {
- "Zipper": "Chumper\\Zipper\\Zipper"
- }
+ "branch-alias": {
+ "dev-master": "2.0-dev"
}
},
"autoload": {
"psr-4": {
- "Chumper\\Zipper\\": "src/Chumper/Zipper"
+ "Asm89\\Stack\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache2"
+ "MIT"
],
"authors": [
{
- "name": "Nils Plaschke",
- "email": "github@nilsplaschke.de",
- "homepage": "http://nilsplaschke.de",
- "role": "Developer"
+ "name": "Alexander",
+ "email": "iam.asm89@gmail.com"
}
],
- "description": "This is a little neat helper for the ZipArchive methods with handy functions",
- "homepage": "http://github.com/Chumper/zipper",
+ "description": "Cross-origin resource sharing library and stack middleware",
+ "homepage": "https://github.com/asm89/stack-cors",
"keywords": [
- "archive",
- "laravel",
- "zip"
+ "cors",
+ "stack"
],
- "time": "2017-07-17T08:05:10+00:00"
+ "support": {
+ "issues": "https://github.com/asm89/stack-cors/issues",
+ "source": "https://github.com/asm89/stack-cors/tree/v2.0.3"
+ },
+ "time": "2021-03-11T06:42:03+00:00"
},
{
- "name": "classpreloader/classpreloader",
- "version": "3.0.0",
+ "name": "barryvdh/laravel-cors",
+ "version": "v2.0.3",
"source": {
"type": "git",
- "url": "https://github.com/ClassPreloader/ClassPreloader.git",
- "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a"
+ "url": "https://github.com/fruitcake/laravel-cors.git",
+ "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/9b10b913c2bdf90c3d2e0d726b454fb7f77c552a",
- "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a",
- "shasum": ""
+ "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/01de0fe5f71c70d1930ee9a80385f9cc28e0f63a",
+ "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "nikic/php-parser": "^1.0|^2.0",
- "php": ">=5.5.9"
+ "asm89/stack-cors": "^2.0.1",
+ "illuminate/contracts": "^6|^7|^8|^9",
+ "illuminate/support": "^6|^7|^8|^9",
+ "php": ">=7.2",
+ "symfony/http-foundation": "^4|^5",
+ "symfony/http-kernel": "^4.3.4|^5"
},
"require-dev": {
- "phpunit/phpunit": "^4.8|^5.0"
+ "laravel/framework": "^6|^7|^8",
+ "orchestra/testbench-dusk": "^4|^5|^6",
+ "phpunit/phpunit": "^6|^7|^8",
+ "squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "2.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Fruitcake\\Cors\\CorsServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "ClassPreloader\\": "src/"
+ "Fruitcake\\Cors\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -314,84 +299,135 @@
],
"authors": [
{
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com"
+ "name": "Fruitcake",
+ "homepage": "https://fruitcake.nl"
},
{
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
}
],
- "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case",
+ "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
"keywords": [
- "autoload",
- "class",
- "preload"
+ "api",
+ "cors",
+ "crossdomain",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/fruitcake/laravel-cors/issues",
+ "source": "https://github.com/fruitcake/laravel-cors/tree/v2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
],
- "time": "2015-11-09T22:51:51+00:00"
+ "time": "2020-10-22T13:57:20+00:00"
},
{
- "name": "dnoegel/php-xdg-base-dir",
- "version": "0.1",
+ "name": "brick/math",
+ "version": "0.9.2",
"source": {
"type": "git",
- "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
- "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a"
+ "url": "https://github.com/brick/math.git",
+ "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a",
- "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a",
- "shasum": ""
+ "url": "https://api.github.com/repos/brick/math/zipball/dff976c2f3487d42c1db75a3b180e2b9f0e72ce0",
+ "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.2"
+ "ext-json": "*",
+ "php": "^7.1 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "@stable"
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0",
+ "vimeo/psalm": "4.3.2"
},
- "type": "project",
+ "type": "library",
"autoload": {
"psr-4": {
- "XdgBaseDir\\": "src/"
+ "Brick\\Math\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "description": "implementation of xdg base directory specification for php",
- "time": "2014-10-24T07:27:01+00:00"
+ "description": "Arbitrary-precision arithmetic library",
+ "keywords": [
+ "Arbitrary-precision",
+ "BigInteger",
+ "BigRational",
+ "arithmetic",
+ "bigdecimal",
+ "bignum",
+ "brick",
+ "math"
+ ],
+ "support": {
+ "issues": "https://github.com/brick/math/issues",
+ "source": "https://github.com/brick/math/tree/0.9.2"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/brick/math",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-20T22:51:39+00:00"
},
{
- "name": "doctrine/inflector",
- "version": "v1.1.0",
+ "name": "cache/adapter-common",
+ "version": "1.2.0",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/inflector.git",
- "reference": "90b2128806bfde671b6952ab8bea493942c1fdae"
+ "url": "https://github.com/php-cache/adapter-common.git",
+ "reference": "6b87c5cbdf03be42437b595dbe5de8e97cd1d497"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae",
- "reference": "90b2128806bfde671b6952ab8bea493942c1fdae",
- "shasum": ""
+ "url": "https://api.github.com/repos/php-cache/adapter-common/zipball/6b87c5cbdf03be42437b595dbe5de8e97cd1d497",
+ "reference": "6b87c5cbdf03be42437b595dbe5de8e97cd1d497",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.2"
+ "cache/tag-interop": "^1.0",
+ "php": "^5.6 || ^7.0 || ^8.0",
+ "psr/cache": "^1.0",
+ "psr/log": "^1.0",
+ "psr/simple-cache": "^1.0"
},
"require-dev": {
- "phpunit/phpunit": "4.*"
+ "cache/integration-tests": "^0.16",
+ "phpunit/phpunit": "^5.7.21"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1.x-dev"
+ "dev-master": "1.1-dev"
}
},
"autoload": {
- "psr-0": {
- "Doctrine\\Common\\Inflector\\": "lib/"
+ "psr-4": {
+ "Cache\\Adapter\\Common\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -400,108 +436,139 @@
],
"authors": [
{
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
},
{
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
}
],
- "description": "Common String Manipulations with regard to casing and singular/plural rules.",
- "homepage": "http://www.doctrine-project.org",
+ "description": "Common classes for PSR-6 adapters",
+ "homepage": "http://www.php-cache.com/en/latest/",
"keywords": [
- "inflection",
- "pluralize",
- "singularize",
- "string"
+ "cache",
+ "psr-6",
+ "tag"
],
- "time": "2015-11-06T14:35:42+00:00"
+ "support": {
+ "source": "https://github.com/php-cache/adapter-common/tree/1.2.0"
+ },
+ "time": "2020-12-14T12:17:39+00:00"
},
{
- "name": "jakub-onderka/php-console-color",
- "version": "0.1",
+ "name": "cache/filesystem-adapter",
+ "version": "1.1.0",
"source": {
"type": "git",
- "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
- "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1"
+ "url": "https://github.com/php-cache/filesystem-adapter.git",
+ "reference": "1501ca71502f45114844824209e6a41d87afb221"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1",
- "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1",
- "shasum": ""
+ "url": "https://api.github.com/repos/php-cache/filesystem-adapter/zipball/1501ca71502f45114844824209e6a41d87afb221",
+ "reference": "1501ca71502f45114844824209e6a41d87afb221",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.2"
+ "cache/adapter-common": "^1.0",
+ "league/flysystem": "^1.0",
+ "php": "^5.6 || ^7.0 || ^8.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0",
+ "psr/simple-cache-implementation": "^1.0"
},
"require-dev": {
- "jakub-onderka/php-code-style": "1.0",
- "jakub-onderka/php-parallel-lint": "0.*",
- "jakub-onderka/php-var-dump-check": "0.*",
- "phpunit/phpunit": "3.7.*",
- "squizlabs/php_codesniffer": "1.*"
+ "cache/integration-tests": "^0.16",
+ "phpunit/phpunit": "^5.7.21"
},
"type": "library",
- "autoload": {
- "psr-0": {
- "JakubOnderka\\PhpConsoleColor": "src/"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
}
},
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-2-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Jakub Onderka",
- "email": "jakub.onderka@gmail.com",
- "homepage": "http://www.acci.cz"
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
}
],
- "time": "2014-04-08T15:00:19+00:00"
+ "description": "A PSR-6 cache implementation using filesystem. This implementation supports tags",
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "keywords": [
+ "cache",
+ "filesystem",
+ "psr-6",
+ "tag"
+ ],
+ "support": {
+ "source": "https://github.com/php-cache/filesystem-adapter/tree/1.1.0"
+ },
+ "time": "2020-12-14T12:17:39+00:00"
},
{
- "name": "jakub-onderka/php-console-highlighter",
- "version": "v0.3.2",
+ "name": "cache/tag-interop",
+ "version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
- "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5"
+ "url": "https://github.com/php-cache/tag-interop.git",
+ "reference": "909a5df87e698f1665724a9e84851c11c45fbfb9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5",
- "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5",
- "shasum": ""
+ "url": "https://api.github.com/repos/php-cache/tag-interop/zipball/909a5df87e698f1665724a9e84851c11c45fbfb9",
+ "reference": "909a5df87e698f1665724a9e84851c11c45fbfb9",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "jakub-onderka/php-console-color": "~0.1",
- "php": ">=5.3.0"
- },
- "require-dev": {
- "jakub-onderka/php-code-style": "~1.0",
- "jakub-onderka/php-parallel-lint": "~0.5",
- "jakub-onderka/php-var-dump-check": "~0.1",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~1.5"
+ "php": "^5.5 || ^7.0 || ^8.0",
+ "psr/cache": "^1.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
"autoload": {
- "psr-0": {
- "JakubOnderka\\PhpConsoleHighlighter": "src/"
+ "psr-4": {
+ "Cache\\TagInterop\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -510,242 +577,221 @@
],
"authors": [
{
- "name": "Jakub Onderka",
- "email": "acci@acci.cz",
- "homepage": "http://www.acci.cz/"
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com",
+ "homepage": "https://github.com/nicolas-grekas"
}
],
- "time": "2015-04-20T18:58:01+00:00"
+ "description": "Framework interoperable interfaces for tags",
+ "homepage": "https://www.php-cache.com/en/latest/",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr6",
+ "tag"
+ ],
+ "support": {
+ "issues": "https://github.com/php-cache/tag-interop/issues",
+ "source": "https://github.com/php-cache/tag-interop/tree/1.0.1"
+ },
+ "time": "2020-12-04T14:11:04+00:00"
},
{
- "name": "jenssegers/mongodb",
- "version": "v3.0.2",
+ "name": "cartalyst/sentinel",
+ "version": "v5.1.0",
"source": {
"type": "git",
- "url": "https://github.com/jenssegers/laravel-mongodb.git",
- "reference": "e1c12ac063eb0d5f4f10cc91f6e269b67cae4e80"
+ "url": "https://github.com/cartalyst/sentinel.git",
+ "reference": "6f641c0c6fda3627a6aee9d1cd3c409e73e4fd0d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jenssegers/laravel-mongodb/zipball/e1c12ac063eb0d5f4f10cc91f6e269b67cae4e80",
- "reference": "e1c12ac063eb0d5f4f10cc91f6e269b67cae4e80",
- "shasum": ""
+ "url": "https://api.github.com/repos/cartalyst/sentinel/zipball/6f641c0c6fda3627a6aee9d1cd3c409e73e4fd0d",
+ "reference": "6f641c0c6fda3627a6aee9d1cd3c409e73e4fd0d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "illuminate/container": "^5.1",
- "illuminate/database": "^5.1",
- "illuminate/events": "^5.1",
- "illuminate/support": "^5.1",
- "mongodb/mongodb": "^1.0.0"
+ "cartalyst/support": "^5.0",
+ "illuminate/support": "^8.0",
+ "php": "^7.3 || ^8.0"
},
"require-dev": {
- "mockery/mockery": "^0.9",
- "orchestra/testbench": "^3.1",
- "phpunit/phpunit": "^4.0|^5.0",
- "satooshi/php-coveralls": "^0.6"
+ "cartalyst/php-cs-fixer-config": "^1.0",
+ "illuminate/cookie": "^8.0",
+ "illuminate/database": "^8.0",
+ "illuminate/events": "^8.0",
+ "illuminate/http": "^8.0",
+ "illuminate/session": "^8.0",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^9.0"
},
"suggest": {
- "jenssegers/mongodb-sentry": "Add Sentry support to Laravel-MongoDB",
- "jenssegers/mongodb-session": "Add MongoDB session support to Laravel-MongoDB"
+ "illuminate/database": "By default, Sentinel utilizes the powerful Illuminate database layer.",
+ "illuminate/events": "To hook into various events across Sentinel, we recommend using Illuminate's event dispatcher.",
+ "symfony/http-foundation": "Required for native implementations."
},
"type": "library",
+ "extra": {
+ "component": "package",
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Cartalyst\\Sentinel\\Laravel\\SentinelServiceProvider"
+ ],
+ "aliases": {
+ "Activation": "Cartalyst\\Sentinel\\Laravel\\Facades\\Activation",
+ "Reminder": "Cartalyst\\Sentinel\\Laravel\\Facades\\Reminder",
+ "Sentinel": "Cartalyst\\Sentinel\\Laravel\\Facades\\Sentinel"
+ }
+ }
+ },
"autoload": {
- "psr-0": {
- "Jenssegers\\Mongodb": "src/",
- "Jenssegers\\Eloquent": "src/"
+ "psr-4": {
+ "Cartalyst\\Sentinel\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Jens Segers",
- "homepage": "https://jenssegers.com"
+ "name": "Cartalyst LLC",
+ "email": "help@cartalyst.com",
+ "homepage": "https://cartalyst.com"
}
],
- "description": "A MongoDB based Eloquent model and Query builder for Laravel (Moloquent)",
- "homepage": "https://github.com/jenssegers/laravel-mongodb",
+ "description": "PHP 7.3+ Fully-featured Authentication & Authorization System",
"keywords": [
- "database",
- "eloquent",
+ "auth",
+ "cartalyst",
"laravel",
- "model",
- "moloquent",
- "mongo",
- "mongodb"
+ "php",
+ "security"
],
- "time": "2016-03-04T21:34:41+00:00"
+ "support": {
+ "issues": "https://github.com/cartalyst/sentinel/issues",
+ "source": "https://github.com/cartalyst/sentinel/tree/v5.1.0"
+ },
+ "time": "2020-12-22T19:31:31+00:00"
},
{
- "name": "jeremeamia/SuperClosure",
- "version": "2.2.0",
+ "name": "cartalyst/support",
+ "version": "v5.1.2",
"source": {
"type": "git",
- "url": "https://github.com/jeremeamia/super_closure.git",
- "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938"
+ "url": "https://github.com/cartalyst/support.git",
+ "reference": "1bf18efdc7e1c7bd4adabdbccfac48ce0fa946fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/29a88be2a4846d27c1613aed0c9071dfad7b5938",
- "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938",
- "shasum": ""
+ "url": "https://api.github.com/repos/cartalyst/support/zipball/1bf18efdc7e1c7bd4adabdbccfac48ce0fa946fe",
+ "reference": "1bf18efdc7e1c7bd4adabdbccfac48ce0fa946fe",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "nikic/php-parser": "^1.2|^2.0",
- "php": ">=5.4",
- "symfony/polyfill-php56": "^1.0"
+ "php": "^7.3 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.0|^5.0"
+ "cartalyst/php-cs-fixer-config": "^1.0",
+ "illuminate/mail": "^8.0",
+ "illuminate/validation": "^8.0",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^9.0",
+ "symfony/translation": "^5.1"
},
"type": "library",
"extra": {
+ "component": "package",
"branch-alias": {
- "dev-master": "2.2-dev"
+ "dev-master": "5.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "SuperClosure\\": "src/"
+ "Cartalyst\\Support\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Jeremy Lindblom",
- "email": "jeremeamia@gmail.com",
- "homepage": "https://github.com/jeremeamia",
- "role": "Developer"
+ "name": "Cartalyst LLC",
+ "email": "help@cartalyst.com",
+ "homepage": "https://cartalyst.com"
}
],
- "description": "Serialize Closure objects, including their context and binding",
- "homepage": "https://github.com/jeremeamia/super_closure",
+ "description": "Support helpers.",
"keywords": [
- "closure",
- "function",
- "lambda",
- "parser",
- "serializable",
- "serialize",
- "tokenizer"
+ "cartalyst",
+ "helper",
+ "laravel",
+ "support"
],
- "time": "2015-12-05T17:17:57+00:00"
+ "support": {
+ "issues": "https://github.com/cartalyst/support/issues",
+ "source": "https://github.com/cartalyst/support/tree/v5.1.2"
+ },
+ "time": "2021-03-01T17:41:34+00:00"
},
{
- "name": "laravel/framework",
- "version": "5.2.41",
+ "name": "catfan/medoo",
+ "version": "v1.7.10",
"source": {
"type": "git",
- "url": "https://github.com/laravel/framework.git",
- "reference": "29ba2e310cfeb42ab6545bcd81ff4c2ec1f6b5c2"
+ "url": "https://github.com/catfan/Medoo.git",
+ "reference": "2d675f73e23f63bbaeb9a8aa33318659a3d3c32f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/29ba2e310cfeb42ab6545bcd81ff4c2ec1f6b5c2",
- "reference": "29ba2e310cfeb42ab6545bcd81ff4c2ec1f6b5c2",
- "shasum": ""
+ "url": "https://api.github.com/repos/catfan/Medoo/zipball/2d675f73e23f63bbaeb9a8aa33318659a3d3c32f",
+ "reference": "2d675f73e23f63bbaeb9a8aa33318659a3d3c32f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "classpreloader/classpreloader": "~3.0",
- "doctrine/inflector": "~1.0",
- "ext-mbstring": "*",
- "ext-openssl": "*",
- "jeremeamia/superclosure": "~2.2",
- "league/flysystem": "~1.0",
- "monolog/monolog": "~1.11",
- "mtdowling/cron-expression": "~1.0",
- "nesbot/carbon": "~1.20",
- "paragonie/random_compat": "~1.4",
- "php": ">=5.5.9",
- "psy/psysh": "0.7.*",
- "swiftmailer/swiftmailer": "~5.1",
- "symfony/console": "2.8.*|3.0.*",
- "symfony/debug": "2.8.*|3.0.*",
- "symfony/finder": "2.8.*|3.0.*",
- "symfony/http-foundation": "2.8.*|3.0.*",
- "symfony/http-kernel": "2.8.*|3.0.*",
- "symfony/polyfill-php56": "~1.0",
- "symfony/process": "2.8.*|3.0.*",
- "symfony/routing": "2.8.*|3.0.*",
- "symfony/translation": "2.8.*|3.0.*",
- "symfony/var-dumper": "2.8.*|3.0.*",
- "vlucas/phpdotenv": "~2.2"
- },
- "replace": {
- "illuminate/auth": "self.version",
- "illuminate/broadcasting": "self.version",
- "illuminate/bus": "self.version",
- "illuminate/cache": "self.version",
- "illuminate/config": "self.version",
- "illuminate/console": "self.version",
- "illuminate/container": "self.version",
- "illuminate/contracts": "self.version",
- "illuminate/cookie": "self.version",
- "illuminate/database": "self.version",
- "illuminate/encryption": "self.version",
- "illuminate/events": "self.version",
- "illuminate/exception": "self.version",
- "illuminate/filesystem": "self.version",
- "illuminate/hashing": "self.version",
- "illuminate/http": "self.version",
- "illuminate/log": "self.version",
- "illuminate/mail": "self.version",
- "illuminate/pagination": "self.version",
- "illuminate/pipeline": "self.version",
- "illuminate/queue": "self.version",
- "illuminate/redis": "self.version",
- "illuminate/routing": "self.version",
- "illuminate/session": "self.version",
- "illuminate/support": "self.version",
- "illuminate/translation": "self.version",
- "illuminate/validation": "self.version",
- "illuminate/view": "self.version",
- "tightenco/collect": "self.version"
- },
- "require-dev": {
- "aws/aws-sdk-php": "~3.0",
- "mockery/mockery": "~0.9.4",
- "pda/pheanstalk": "~3.0",
- "phpunit/phpunit": "~4.1",
- "predis/predis": "~1.0",
- "symfony/css-selector": "2.8.*|3.0.*",
- "symfony/dom-crawler": "2.8.*|3.0.*"
+ "ext-pdo": "*",
+ "php": ">=5.4"
},
"suggest": {
- "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).",
- "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).",
- "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).",
- "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).",
- "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).",
- "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).",
- "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).",
- "predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
- "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).",
- "symfony/css-selector": "Required to use some of the crawler integration testing tools (2.8.*|3.0.*).",
- "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*).",
- "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)."
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.2-dev"
- }
- },
+ "ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
+ "ext-pdo_mysql": "For MySQL or MariaDB database",
+ "ext-pdo_oci": "For Oracle database",
+ "ext-pdo_oci8": "For Oracle version 8 database",
+ "ext-pdo_pqsql": "For PostgreSQL database",
+ "ext-pdo_sqlite": "For SQLite database",
+ "ext-pdo_sqlsrv": "For MSSQL database on both Window/Liunx platform"
+ },
+ "type": "framework",
"autoload": {
- "classmap": [
- "src/Illuminate/Queue/IlluminateQueueClosure.php"
- ],
- "files": [
- "src/Illuminate/Foundation/helpers.php",
- "src/Illuminate/Support/helpers.php"
- ],
"psr-4": {
- "Illuminate\\": "src/Illuminate/"
+ "Medoo\\": "/src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -754,67 +800,73 @@
],
"authors": [
{
- "name": "Taylor Otwell",
- "email": "taylorotwell@gmail.com"
+ "name": "Angel Lai",
+ "email": "angel@catfan.me"
}
],
- "description": "The Laravel Framework.",
- "homepage": "http://laravel.com",
+ "description": "The lightweight PHP database framework to accelerate development",
+ "homepage": "https://medoo.in",
"keywords": [
- "framework",
- "laravel"
- ],
- "time": "2016-07-20T13:13:06+00:00"
+ "database",
+ "database library",
+ "lightweight",
+ "mariadb",
+ "mssql",
+ "mysql",
+ "oracle",
+ "php framework",
+ "postgresql",
+ "sql",
+ "sqlite"
+ ],
+ "support": {
+ "issues": "https://github.com/catfan/Medoo/issues",
+ "source": "https://github.com/catfan/Medoo"
+ },
+ "time": "2020-02-11T08:20:42+00:00"
},
{
- "name": "league/flysystem",
- "version": "1.0.25",
+ "name": "composer/package-versions-deprecated",
+ "version": "1.11.99.1",
"source": {
"type": "git",
- "url": "https://github.com/thephpleague/flysystem.git",
- "reference": "a76afa4035931be0c78ca8efc6abf3902362f437"
+ "url": "https://github.com/composer/package-versions-deprecated.git",
+ "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a76afa4035931be0c78ca8efc6abf3902362f437",
- "reference": "a76afa4035931be0c78ca8efc6abf3902362f437",
- "shasum": ""
+ "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6",
+ "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.4.0"
+ "composer-plugin-api": "^1.1.0 || ^2.0",
+ "php": "^7 || ^8"
},
- "conflict": {
- "league/flysystem-sftp": "<1.0.6"
+ "replace": {
+ "ocramius/package-versions": "1.11.99"
},
"require-dev": {
- "ext-fileinfo": "*",
- "mockery/mockery": "~0.9",
- "phpspec/phpspec": "^2.2",
- "phpunit/phpunit": "~4.8"
- },
- "suggest": {
- "ext-fileinfo": "Required for MimeType",
- "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
- "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
- "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
- "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
- "league/flysystem-copy": "Allows you to use Copy.com storage",
- "league/flysystem-dropbox": "Allows you to use Dropbox storage",
- "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
- "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
- "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
- "league/flysystem-webdav": "Allows you to use WebDAV storage",
- "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter"
+ "composer/composer": "^1.9.3 || ^2.0@dev",
+ "ext-zip": "^1.13",
+ "phpunit/phpunit": "^6.5 || ^7"
},
- "type": "library",
+ "type": "composer-plugin",
"extra": {
+ "class": "PackageVersions\\Installer",
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
- "League\\Flysystem\\": "src/"
+ "PackageVersions\\": "src/PackageVersions"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -823,210 +875,248 @@
],
"authors": [
{
- "name": "Frank de Jonge",
- "email": "info@frenky.net"
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
}
],
- "description": "Filesystem abstraction: Many filesystems, one API.",
- "keywords": [
- "Cloud Files",
- "WebDAV",
- "abstraction",
- "aws",
- "cloud",
- "copy.com",
- "dropbox",
- "file systems",
- "files",
- "filesystem",
- "filesystems",
- "ftp",
- "rackspace",
- "remote",
- "s3",
- "sftp",
- "storage"
+ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "support": {
+ "issues": "https://github.com/composer/package-versions-deprecated/issues",
+ "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
],
- "time": "2016-07-18T12:22:57+00:00"
+ "time": "2020-11-11T10:22:58+00:00"
},
{
- "name": "maatwebsite/excel",
- "version": "2.1.10",
+ "name": "doctrine/inflector",
+ "version": "2.0.3",
"source": {
"type": "git",
- "url": "https://github.com/Maatwebsite/Laravel-Excel.git",
- "reference": "a544a9b45b971499fb3b0fb7499ba0ac3b430233"
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/a544a9b45b971499fb3b0fb7499ba0ac3b430233",
- "reference": "a544a9b45b971499fb3b0fb7499ba0ac3b430233",
- "shasum": ""
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
+ "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "illuminate/cache": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/config": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/filesystem": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*",
- "nesbot/carbon": "~1.0",
- "php": ">=5.5",
- "phpoffice/phpexcel": "1.8.*",
- "tijsverkoyen/css-to-inline-styles": "~2.0"
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "mockery/mockery": "~0.9",
- "orchestra/testbench": "3.1.*",
- "phpseclib/phpseclib": "~1.0",
- "phpunit/phpunit": "~4.0"
- },
- "suggest": {
- "illuminate/http": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/queue": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/routing": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/view": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*"
+ "doctrine/coding-standard": "^7.0",
+ "phpstan/phpstan": "^0.11",
+ "phpstan/phpstan-phpunit": "^0.11",
+ "phpstan/phpstan-strict-rules": "^0.11",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
"autoload": {
- "classmap": [
- "src/Maatwebsite/Excel"
- ],
- "psr-0": {
- "Maatwebsite\\Excel\\": "src/"
+ "psr-4": {
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
+ "MIT"
],
"authors": [
{
- "name": "Maatwebsite.nl",
- "email": "patrick@maatwebsite.nl"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
}
],
- "description": "An eloquent way of importing and exporting Excel and CSV in Laravel 4 with the power of PHPExcel",
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
"keywords": [
- "PHPExcel",
- "batch",
- "csv",
- "excel",
- "export",
- "import",
- "laravel"
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.0.x"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
],
- "time": "2017-01-20T16:16:51+00:00"
+ "time": "2020-05-29T15:13:26+00:00"
},
{
- "name": "mongodb/mongodb",
- "version": "1.0.2",
+ "name": "doctrine/instantiator",
+ "version": "1.4.0",
"source": {
"type": "git",
- "url": "https://github.com/mongodb/mongo-php-library.git",
- "reference": "faf8a1d86b5c10684ef91fa6c81475b0c7f95240"
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/faf8a1d86b5c10684ef91fa6c81475b0c7f95240",
- "reference": "faf8a1d86b5c10684ef91fa6c81475b0c7f95240",
- "shasum": ""
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "ext-mongodb": "^1.1.0",
- "php": ">=5.4"
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.0",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "MongoDB\\": "src/"
- },
- "files": [
- "src/functions.php"
- ]
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
+ "MIT"
],
"authors": [
{
- "name": "Jeremy Mikola",
- "email": "jmikola@gmail.com"
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
},
{
- "name": "Hannes Magnusson",
- "email": "bjori@mongodb.com"
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
},
{
- "name": "Derick Rethans",
- "email": "github@derickrethans.nl"
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
}
],
- "description": "MongoDB driver library",
- "homepage": "https://jira.mongodb.org/browse/PHPLIB",
- "keywords": [
- "database",
- "driver",
- "mongodb",
- "persistence"
- ],
- "time": "2016-03-30T19:10:28+00:00"
+ "time": "2020-11-10T18:47:58+00:00"
},
{
- "name": "monolog/monolog",
- "version": "1.20.0",
+ "name": "doctrine/lexer",
+ "version": "1.2.1",
"source": {
"type": "git",
- "url": "https://github.com/Seldaek/monolog.git",
- "reference": "55841909e2bcde01b5318c35f2b74f8ecc86e037"
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "e864bbf5904cb8f5bb334f99209b48018522f042"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/55841909e2bcde01b5318c35f2b74f8ecc86e037",
- "reference": "55841909e2bcde01b5318c35f2b74f8ecc86e037",
- "shasum": ""
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042",
+ "reference": "e864bbf5904cb8f5bb334f99209b48018522f042",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.0",
- "psr/log": "~1.0"
- },
- "provide": {
- "psr/log-implementation": "1.0.0"
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "aws/aws-sdk-php": "^2.4.9",
- "doctrine/couchdb": "~1.0@dev",
- "graylog2/gelf-php": "~1.0",
- "jakub-onderka/php-parallel-lint": "0.9",
- "php-amqplib/php-amqplib": "~2.4",
- "php-console/php-console": "^3.1.3",
- "phpunit/phpunit": "~4.5",
- "phpunit/phpunit-mock-objects": "2.3.0",
- "ruflin/elastica": ">=0.90 <3.0",
- "sentry/sentry": "^0.13",
- "swiftmailer/swiftmailer": "~5.3"
- },
- "suggest": {
- "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
- "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
- "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
- "ext-mongo": "Allow sending log messages to a MongoDB server",
- "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
- "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
- "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
- "php-console/php-console": "Allow sending log messages to Google Chrome",
- "rollbar/rollbar": "Allow sending log messages to Rollbar",
- "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
- "sentry/sentry": "Allow sending log messages to a Sentry server"
+ "doctrine/coding-standard": "^6.0",
+ "phpstan/phpstan": "^0.11.8",
+ "phpunit/phpunit": "^8.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "1.2.x-dev"
}
},
"autoload": {
"psr-4": {
- "Monolog\\": "src/Monolog"
+ "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1035,44 +1125,84 @@
],
"authors": [
{
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
}
],
- "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
- "homepage": "http://github.com/Seldaek/monolog",
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
"keywords": [
- "log",
- "logging",
- "psr-3"
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
],
- "time": "2016-07-02T14:02:10+00:00"
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-25T17:44:05+00:00"
},
{
- "name": "mtdowling/cron-expression",
- "version": "v1.1.0",
+ "name": "dragonmantank/cron-expression",
+ "version": "v3.1.0",
"source": {
"type": "git",
- "url": "https://github.com/mtdowling/cron-expression.git",
- "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5"
+ "url": "https://github.com/dragonmantank/cron-expression.git",
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5",
- "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5",
- "shasum": ""
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.2"
+ "php": "^7.2|^8.0",
+ "webmozart/assert": "^1.7.0"
+ },
+ "replace": {
+ "mtdowling/cron-expression": "^1.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0|~5.0"
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-webmozart-assert": "^0.12.7",
+ "phpunit/phpunit": "^7.0|^8.0|^9.0"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Cron": "src/"
+ "psr-4": {
+ "Cron\\": "src/Cron/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1081,9 +1211,9 @@
],
"authors": [
{
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
+ "name": "Chris Tankersley",
+ "email": "chris@ctankersley.com",
+ "homepage": "https://github.com/dragonmantank"
}
],
"description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
@@ -1091,33 +1221,60 @@
"cron",
"schedule"
],
- "time": "2016-01-26T21:23:30+00:00"
+ "support": {
+ "issues": "https://github.com/dragonmantank/cron-expression/issues",
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-24T19:55:57+00:00"
},
{
- "name": "nesbot/carbon",
- "version": "1.21.0",
+ "name": "egulias/email-validator",
+ "version": "2.1.25",
"source": {
"type": "git",
- "url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7"
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7b08ec6f75791e130012f206e3f7b0e76e18e3d7",
- "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7",
- "shasum": ""
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.0",
- "symfony/translation": "~2.6|~3.0"
+ "doctrine/lexer": "^1.0.1",
+ "php": ">=5.5",
+ "symfony/polyfill-intl-idn": "^1.10"
},
"require-dev": {
- "phpunit/phpunit": "~4.0|~5.0"
+ "dominicsayers/isemail": "^3.0.7",
+ "phpunit/phpunit": "^4.8.36|^7.5.15",
+ "satooshi/php-coveralls": "^1.0.1"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "Carbon\\": "src/Carbon/"
+ "Egulias\\EmailValidator\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1126,195 +1283,276 @@
],
"authors": [
{
- "name": "Brian Nesbitt",
- "email": "brian@nesbot.com",
- "homepage": "http://nesbot.com"
+ "name": "Eduardo Gulias Davis"
}
],
- "description": "A simple API extension for DateTime.",
- "homepage": "http://carbon.nesbot.com",
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
"keywords": [
- "date",
- "datetime",
- "time"
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/egulias/EmailValidator/issues",
+ "source": "https://github.com/egulias/EmailValidator/tree/2.1.25"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
],
- "time": "2015-11-04T20:07:17+00:00"
+ "time": "2020-12-29T14:50:06+00:00"
},
{
- "name": "nikic/php-parser",
- "version": "v2.1.0",
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.13.0",
"source": {
"type": "git",
- "url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3"
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/47b254ea51f1d6d5dc04b9b299e88346bf2369e3",
- "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3",
- "shasum": ""
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75",
+ "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "ext-tokenizer": "*",
- "php": ">=5.4"
+ "php": ">=5.2"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd"
},
- "bin": [
- "bin/php-parse"
- ],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1-dev"
- }
- },
"autoload": {
- "psr-4": {
- "PhpParser\\": "lib/PhpParser"
- }
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ],
+ "exclude-from-classmap": [
+ "/library/HTMLPurifier/Language/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "LGPL-2.1-or-later"
],
"authors": [
{
- "name": "Nikita Popov"
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
}
],
- "description": "A PHP parser written in PHP",
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
"keywords": [
- "parser",
- "php"
+ "html"
],
- "time": "2016-04-19T13:41:41+00:00"
+ "support": {
+ "issues": "https://github.com/ezyang/htmlpurifier/issues",
+ "source": "https://github.com/ezyang/htmlpurifier/tree/master"
+ },
+ "time": "2020-06-29T00:56:53+00:00"
},
{
- "name": "paragonie/random_compat",
- "version": "v1.4.1",
+ "name": "facade/flare-client-php",
+ "version": "1.7.0",
"source": {
"type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "c7e26a21ba357863de030f0b9e701c7d04593774"
+ "url": "https://github.com/facade/flare-client-php.git",
+ "reference": "6bf380035890cb0a09b9628c491ae3866b858522"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774",
- "reference": "c7e26a21ba357863de030f0b9e701c7d04593774",
- "shasum": ""
+ "url": "https://api.github.com/repos/facade/flare-client-php/zipball/6bf380035890cb0a09b9628c491ae3866b858522",
+ "reference": "6bf380035890cb0a09b9628c491ae3866b858522",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.2.0"
+ "facade/ignition-contracts": "~1.0",
+ "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0",
+ "php": "^7.1|^8.0",
+ "symfony/http-foundation": "^3.3|^4.1|^5.0",
+ "symfony/mime": "^3.4|^4.0|^5.1",
+ "symfony/var-dumper": "^3.4|^4.0|^5.0"
},
"require-dev": {
- "phpunit/phpunit": "4.*|5.*"
- },
- "suggest": {
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ "friendsofphp/php-cs-fixer": "^2.14",
+ "phpunit/phpunit": "^7.5.16",
+ "spatie/phpunit-snapshot-assertions": "^2.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
"autoload": {
+ "psr-4": {
+ "Facade\\FlareClient\\": "src"
+ },
"files": [
- "lib/random.php"
+ "src/helpers.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
+ "description": "Send PHP errors to Flare",
+ "homepage": "https://github.com/facade/flare-client-php",
+ "keywords": [
+ "exception",
+ "facade",
+ "flare",
+ "reporting"
+ ],
+ "support": {
+ "issues": "https://github.com/facade/flare-client-php/issues",
+ "source": "https://github.com/facade/flare-client-php/tree/1.7.0"
+ },
+ "funding": [
{
- "name": "Paragon Initiative Enterprises",
- "email": "security@paragonie.com",
- "homepage": "https://paragonie.com"
+ "url": "https://github.com/spatie",
+ "type": "github"
}
],
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
- "keywords": [
- "csprng",
- "pseudorandom",
- "random"
- ],
- "time": "2016-03-18T20:34:03+00:00"
+ "time": "2021-04-12T09:30:36+00:00"
},
{
- "name": "phpoffice/phpexcel",
- "version": "1.8.1",
+ "name": "facade/ignition",
+ "version": "2.8.3",
"source": {
"type": "git",
- "url": "https://github.com/PHPOffice/PHPExcel.git",
- "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32"
+ "url": "https://github.com/facade/ignition.git",
+ "reference": "a8201d51aae83addceaef9344592a3b068b5d64d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPOffice/PHPExcel/zipball/372c7cbb695a6f6f1e62649381aeaa37e7e70b32",
- "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32",
- "shasum": ""
+ "url": "https://api.github.com/repos/facade/ignition/zipball/a8201d51aae83addceaef9344592a3b068b5d64d",
+ "reference": "a8201d51aae83addceaef9344592a3b068b5d64d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "ext-xml": "*",
- "ext-xmlwriter": "*",
- "php": ">=5.2.0"
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "facade/flare-client-php": "^1.6",
+ "facade/ignition-contracts": "^1.0.2",
+ "filp/whoops": "^2.4",
+ "illuminate/support": "^7.0|^8.0",
+ "monolog/monolog": "^2.0",
+ "php": "^7.2.5|^8.0",
+ "symfony/console": "^5.0",
+ "symfony/var-dumper": "^5.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.14",
+ "mockery/mockery": "^1.3",
+ "orchestra/testbench": "^5.0|^6.0",
+ "psalm/plugin-laravel": "^1.2"
+ },
+ "suggest": {
+ "laravel/telescope": "^3.1"
},
"type": "library",
- "autoload": {
- "psr-0": {
- "PHPExcel": "Classes/"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Facade\\Ignition\\IgnitionServiceProvider"
+ ],
+ "aliases": {
+ "Flare": "Facade\\Ignition\\Facades\\Flare"
+ }
}
},
+ "autoload": {
+ "psr-4": {
+ "Facade\\Ignition\\": "src"
+ },
+ "files": [
+ "src/helpers.php"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
- ],
- "authors": [
- {
- "name": "Maarten Balliauw",
- "homepage": "http://blog.maartenballiauw.be"
- },
- {
- "name": "Mark Baker"
- },
- {
- "name": "Franck Lefevre",
- "homepage": "http://blog.rootslabs.net"
- },
- {
- "name": "Erik Tilt"
- }
+ "MIT"
],
- "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
- "homepage": "http://phpexcel.codeplex.com",
+ "description": "A beautiful error page for Laravel applications.",
+ "homepage": "https://github.com/facade/ignition",
"keywords": [
- "OpenXML",
- "excel",
- "php",
- "spreadsheet",
- "xls",
- "xlsx"
+ "error",
+ "flare",
+ "laravel",
+ "page"
],
- "abandoned": "phpoffice/phpspreadsheet",
- "time": "2015-05-01T07:00:55+00:00"
+ "support": {
+ "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction",
+ "forum": "https://twitter.com/flareappio",
+ "issues": "https://github.com/facade/ignition/issues",
+ "source": "https://github.com/facade/ignition"
+ },
+ "time": "2021-04-09T20:45:59+00:00"
},
{
- "name": "psr/log",
- "version": "1.0.0",
+ "name": "facade/ignition-contracts",
+ "version": "1.0.2",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+ "url": "https://github.com/facade/ignition-contracts.git",
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
- "shasum": ""
+ "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v2.15.8",
+ "phpunit/phpunit": "^9.3.11",
+ "vimeo/psalm": "^3.17.1"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Psr\\Log\\": ""
+ "psr-4": {
+ "Facade\\IgnitionContracts\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1323,67 +1561,65 @@
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://flareapp.io",
+ "role": "Developer"
}
],
- "description": "Common interface for logging libraries",
+ "description": "Solution contracts for Ignition",
+ "homepage": "https://github.com/facade/ignition-contracts",
"keywords": [
- "log",
- "psr",
- "psr-3"
+ "contracts",
+ "flare",
+ "ignition"
],
- "time": "2012-12-21T11:40:51+00:00"
+ "support": {
+ "issues": "https://github.com/facade/ignition-contracts/issues",
+ "source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
+ },
+ "time": "2020-10-16T08:27:54+00:00"
},
{
- "name": "psy/psysh",
- "version": "v0.7.2",
+ "name": "fideloper/proxy",
+ "version": "4.4.1",
"source": {
"type": "git",
- "url": "https://github.com/bobthecow/psysh.git",
- "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280"
+ "url": "https://github.com/fideloper/TrustedProxy.git",
+ "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280",
- "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280",
- "shasum": ""
+ "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/c073b2bd04d1c90e04dc1b787662b558dd65ade0",
+ "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "dnoegel/php-xdg-base-dir": "0.1",
- "jakub-onderka/php-console-highlighter": "0.3.*",
- "nikic/php-parser": "^1.2.1|~2.0",
- "php": ">=5.3.9",
- "symfony/console": "~2.3.10|^2.4.2|~3.0",
- "symfony/var-dumper": "~2.7|~3.0"
+ "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "php": ">=5.4.0"
},
"require-dev": {
- "fabpot/php-cs-fixer": "~1.5",
- "phpunit/phpunit": "~3.7|~4.0|~5.0",
- "squizlabs/php_codesniffer": "~2.0",
- "symfony/finder": "~2.1|~3.0"
- },
- "suggest": {
- "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
- "ext-pdo-sqlite": "The doc command requires SQLite to work.",
- "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
- "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history."
+ "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.0"
},
- "bin": [
- "bin/psysh"
- ],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-develop": "0.8.x-dev"
+ "laravel": {
+ "providers": [
+ "Fideloper\\Proxy\\TrustedProxyServiceProvider"
+ ]
}
},
"autoload": {
- "files": [
- "src/Psy/functions.php"
- ],
"psr-4": {
- "Psy\\": "src/Psy/"
+ "Fideloper\\Proxy\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1392,51 +1628,65 @@
],
"authors": [
{
- "name": "Justin Hileman",
- "email": "justin@justinhileman.info",
- "homepage": "http://justinhileman.com"
+ "name": "Chris Fidao",
+ "email": "fideloper@gmail.com"
}
],
- "description": "An interactive shell for modern PHP.",
- "homepage": "http://psysh.org",
+ "description": "Set trusted proxies for Laravel",
"keywords": [
- "REPL",
- "console",
- "interactive",
- "shell"
+ "load balancing",
+ "proxy",
+ "trusted proxy"
],
- "time": "2016-03-09T05:03:14+00:00"
+ "support": {
+ "issues": "https://github.com/fideloper/TrustedProxy/issues",
+ "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.1"
+ },
+ "time": "2020-10-22T13:48:01+00:00"
},
{
- "name": "swiftmailer/swiftmailer",
- "version": "v5.4.3",
+ "name": "filp/whoops",
+ "version": "2.12.0",
"source": {
"type": "git",
- "url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153"
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "d501fd2658d55491a2295ff600ae5978eaad7403"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/4cc92842069c2bbc1f28daaaf1d2576ec4dfe153",
- "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153",
- "shasum": ""
+ "url": "https://api.github.com/repos/filp/whoops/zipball/d501fd2658d55491a2295ff600ae5978eaad7403",
+ "reference": "d501fd2658d55491a2295ff600ae5978eaad7403",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "php": "^5.5.9 || ^7.0 || ^8.0",
+ "psr/log": "^1.0.1"
},
"require-dev": {
- "mockery/mockery": "~0.9.1"
+ "mockery/mockery": "^0.9 || ^1.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.4-dev"
+ "dev-master": "2.7-dev"
}
},
"autoload": {
- "files": [
- "lib/swift_required.php"
- ]
+ "psr-4": {
+ "Whoops\\": "src/Whoops/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1444,63 +1694,70 @@
],
"authors": [
{
- "name": "Chris Corbyn"
- },
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
}
],
- "description": "Swiftmailer, free feature-rich PHP mailer",
- "homepage": "http://swiftmailer.org",
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
"keywords": [
- "email",
- "mail",
- "mailer"
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "support": {
+ "issues": "https://github.com/filp/whoops/issues",
+ "source": "https://github.com/filp/whoops/tree/2.12.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
],
- "time": "2016-07-08T11:51:25+00:00"
+ "time": "2021-03-30T12:00:00+00:00"
},
{
- "name": "symfony/console",
- "version": "v3.0.9",
+ "name": "graham-campbell/result-type",
+ "version": "v1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "926061e74229e935d3c5b4e9ba87237316c6693f"
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/926061e74229e935d3c5b4e9ba87237316c6693f",
- "reference": "926061e74229e935d3c5b4e9ba87237316c6693f",
- "shasum": ""
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": "^7.0|^8.0",
+ "phpoption/phpoption": "^1.7.3"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/event-dispatcher": "~2.8|~3.0",
- "symfony/process": "~2.8|~3.0"
- },
- "suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/process": ""
+ "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "GrahamCampbell\\ResultType\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1508,47 +1765,88 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "An Implementation Of The Result Type",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Result Type",
+ "Result-Type",
+ "result"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
+ "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
}
],
- "description": "Symfony Console Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-30T07:22:48+00:00"
+ "time": "2020-04-13T13:17:36+00:00"
},
{
- "name": "symfony/css-selector",
- "version": "v3.0.9",
+ "name": "guzzlehttp/guzzle",
+ "version": "7.3.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/css-selector.git",
- "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115"
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "7008573787b430c1c1f650e3722d9bba59967628"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/b8999c1f33c224b2b66b38253f5e3a838d0d0115",
- "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115",
- "shasum": ""
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628",
+ "reference": "7008573787b430c1c1f650e3722d9bba59967628",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9"
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.4",
+ "guzzlehttp/psr7": "^1.7 || ^2.0",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "^3.0",
+ "phpunit/phpunit": "^8.5.5 || ^9.3.5",
+ "psr/log": "^1.1"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "7.3-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\CssSelector\\": ""
+ "GuzzleHttp\\": "src/"
},
- "exclude-from-classmap": [
- "/Tests/"
+ "files": [
+ "src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -1557,59 +1855,91 @@
],
"authors": [
{
- "name": "Jean-François Simon",
- "email": "jeanfrancois.simon@sensiolabs.com"
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
},
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/alexeyshockov",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/gmponos",
+ "type": "github"
}
],
- "description": "Symfony CssSelector Component",
- "homepage": "https://symfony.com",
- "time": "2016-06-29T05:40:00+00:00"
+ "time": "2021-03-23T11:33:13+00:00"
},
{
- "name": "symfony/debug",
- "version": "v3.0.9",
+ "name": "guzzlehttp/promises",
+ "version": "1.4.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/debug.git",
- "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a"
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a",
- "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a",
- "shasum": ""
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+ "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9",
- "psr/log": "~1.0"
- },
- "conflict": {
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ "php": ">=5.5"
},
"require-dev": {
- "symfony/class-loader": "~2.8|~3.0",
- "symfony/http-kernel": "~2.8|~3.0"
+ "symfony/phpunit-bridge": "^4.4 || ^5.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "1.4-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\Debug\\": ""
+ "GuzzleHttp\\Promise\\": "src/"
},
- "exclude-from-classmap": [
- "/Tests/"
+ "files": [
+ "src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -1618,58 +1948,68 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
}
],
- "description": "Symfony Debug Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-30T07:22:48+00:00"
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/1.4.1"
+ },
+ "time": "2021-03-07T09:25:29+00:00"
},
{
- "name": "symfony/event-dispatcher",
- "version": "v3.1.3",
+ "name": "guzzlehttp/psr7",
+ "version": "1.8.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "c0c00c80b3a69132c4e55c3e7db32b4a387615e5"
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c0c00c80b3a69132c4e55c3e7db32b4a387615e5",
- "reference": "c0c00c80b3a69132c4e55c3e7db32b4a387615e5",
- "shasum": ""
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1",
+ "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9"
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0",
+ "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/dependency-injection": "~2.8|~3.0",
- "symfony/expression-language": "~2.8|~3.0",
- "symfony/stopwatch": "~2.8|~3.0"
+ "ext-zlib": "*",
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
},
"suggest": {
- "symfony/dependency-injection": "",
- "symfony/http-kernel": ""
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-master": "1.7-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\EventDispatcher\\": ""
+ "GuzzleHttp\\Psr7\\": "src/"
},
- "exclude-from-classmap": [
- "/Tests/"
+ "files": [
+ "src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -1678,48 +2018,69 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
}
],
- "description": "Symfony EventDispatcher Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-19T10:45:57+00:00"
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/1.8.1"
+ },
+ "time": "2021-03-21T16:25:00+00:00"
},
{
- "name": "symfony/finder",
- "version": "v3.0.9",
+ "name": "hprose/hprose",
+ "version": "v2.0.40",
"source": {
"type": "git",
- "url": "https://github.com/symfony/finder.git",
- "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9"
+ "url": "https://github.com/hprose/hprose-php.git",
+ "reference": "ab4955a31596a71b0ba205e18a8598a95ef005b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9",
- "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9",
- "shasum": ""
+ "url": "https://api.github.com/repos/hprose/hprose-php/zipball/ab4955a31596a71b0ba205e18a8598a95ef005b4",
+ "reference": "ab4955a31596a71b0ba205e18a8598a95ef005b4",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9"
+ "php": ">=5.3.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
+ "require-dev": {
+ "phpunit/phpunit": ">=4.0.0"
+ },
+ "suggest": {
+ "ext-hprose": "Faster serialize and unserialize hprose extension."
},
+ "type": "library",
"autoload": {
+ "files": [
+ "src/init.php"
+ ],
"psr-4": {
- "Symfony\\Component\\Finder\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Hprose\\": "src/Hprose"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1727,52 +2088,91 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Ma Bingyao",
+ "email": "andot@hprose.com",
+ "homepage": "http://hprose.com",
+ "role": "Developer"
}
],
- "description": "Symfony Finder Component",
- "homepage": "https://symfony.com",
- "time": "2016-06-29T05:40:00+00:00"
+ "description": "It is a modern, lightweight, cross-language, cross-platform, object-oriented, high performance, remote dynamic communication middleware. It is not only easy to use, but powerful. You just need a little time to learn, then you can use it to easily construct cross language cross platform distributed application system.",
+ "homepage": "http://hprose.com/",
+ "keywords": [
+ "HTML5",
+ "Hprose",
+ "Socket",
+ "ajax",
+ "async",
+ "communication",
+ "cross-domain",
+ "cross-language",
+ "cross-platform",
+ "framework",
+ "future",
+ "game",
+ "http",
+ "json",
+ "jsonrpc",
+ "library",
+ "middleware",
+ "phprpc",
+ "protocol",
+ "rpc",
+ "serialization",
+ "serialize",
+ "service",
+ "tcp",
+ "unix",
+ "web",
+ "webapi",
+ "webservice",
+ "websocket",
+ "xmlrpc"
+ ],
+ "support": {
+ "issues": "https://github.com/hprose/hprose-php/issues",
+ "source": "https://github.com/hprose/hprose-php/tree/v2.0.40"
+ },
+ "time": "2020-03-30T15:33:41+00:00"
},
{
- "name": "symfony/http-foundation",
- "version": "v3.0.9",
+ "name": "iidestiny/flysystem-oss",
+ "version": "2.5",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-foundation.git",
- "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82"
+ "url": "https://github.com/iiDestiny/flysystem-oss.git",
+ "reference": "289214b9f26e0ee9a382e1be66b555deb123bb75"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49ba00f8ede742169cb6b70abe33243f4d673f82",
- "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82",
- "shasum": ""
+ "url": "https://api.github.com/repos/iiDestiny/flysystem-oss/zipball/289214b9f26e0ee9a382e1be66b555deb123bb75",
+ "reference": "289214b9f26e0ee9a382e1be66b555deb123bb75",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.1"
+ "aliyuncs/oss-sdk-php": "^2.3",
+ "ext-curl": "*",
+ "ext-json": "*",
+ "ext-openssl": "*",
+ "league/flysystem": "^1.0",
+ "nesbot/carbon": "^1.24.1 || ^2.0",
+ "php": "^7.0 || ^8.0"
},
"require-dev": {
- "symfony/expression-language": "~2.8|~3.0"
+ "mockery/mockery": "^1.2",
+ "phpunit/phpunit": "^6.5",
+ "symfony/var-dumper": "^3.4"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
"autoload": {
"psr-4": {
- "Symfony\\Component\\HttpFoundation\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Iidestiny\\Flysystem\\Oss\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1780,81 +2180,59 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "iidestiny",
+ "email": "iidestiny@vip.qq.com"
}
],
- "description": "Symfony HttpFoundation Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-17T13:54:30+00:00"
+ "description": "Flysystem adapter for the Oss storage.",
+ "keywords": [
+ "alioss",
+ "laravel",
+ "oss",
+ "阿里oss"
+ ],
+ "support": {
+ "issues": "https://github.com/iiDestiny/flysystem-oss/issues",
+ "source": "https://github.com/iiDestiny/flysystem-oss/tree/2.5"
+ },
+ "time": "2020-12-02T02:52:53+00:00"
},
{
- "name": "symfony/http-kernel",
- "version": "v3.0.9",
+ "name": "iidestiny/laravel-filesystem-oss",
+ "version": "2.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-kernel.git",
- "reference": "d97ba4425e36e79c794e7d14ff36f00f081b37b3"
+ "url": "https://github.com/iiDestiny/laravel-filesystem-oss.git",
+ "reference": "ae3cd6fd3cd727eedda0e2bcd0403a6d79fe4223"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d97ba4425e36e79c794e7d14ff36f00f081b37b3",
- "reference": "d97ba4425e36e79c794e7d14ff36f00f081b37b3",
- "shasum": ""
+ "url": "https://api.github.com/repos/iiDestiny/laravel-filesystem-oss/zipball/ae3cd6fd3cd727eedda0e2bcd0403a6d79fe4223",
+ "reference": "ae3cd6fd3cd727eedda0e2bcd0403a6d79fe4223",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9",
- "psr/log": "~1.0",
- "symfony/debug": "~2.8|~3.0",
- "symfony/event-dispatcher": "~2.8|~3.0",
- "symfony/http-foundation": "~2.8.8|~3.0.8|~3.1.2|~3.2"
- },
- "conflict": {
- "symfony/config": "<2.8"
- },
- "require-dev": {
- "symfony/browser-kit": "~2.8|~3.0",
- "symfony/class-loader": "~2.8|~3.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/console": "~2.8|~3.0",
- "symfony/css-selector": "~2.8|~3.0",
- "symfony/dependency-injection": "~2.8|~3.0",
- "symfony/dom-crawler": "~2.8|~3.0",
- "symfony/expression-language": "~2.8|~3.0",
- "symfony/finder": "~2.8|~3.0",
- "symfony/process": "~2.8|~3.0",
- "symfony/routing": "~2.8|~3.0",
- "symfony/stopwatch": "~2.8|~3.0",
- "symfony/templating": "~2.8|~3.0",
- "symfony/translation": "~2.8|~3.0",
- "symfony/var-dumper": "~2.8|~3.0"
- },
- "suggest": {
- "symfony/browser-kit": "",
- "symfony/class-loader": "",
- "symfony/config": "",
- "symfony/console": "",
- "symfony/dependency-injection": "",
- "symfony/finder": "",
- "symfony/var-dumper": ""
+ "iidestiny/flysystem-oss": "~2.0",
+ "php": "^7.0|^8.0"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
+ "laravel": {
+ "providers": [
+ "Iidestiny\\LaravelFilesystemOss\\OssStorageServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\HttpKernel\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Iidestiny\\LaravelFilesystemOss\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1862,51 +2240,46 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "iidestiny",
+ "email": "iidestiny@vip.qq.com"
}
],
- "description": "Symfony HttpKernel Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-30T09:10:37+00:00"
+ "description": "Oss storage filesystem for Laravel.",
+ "support": {
+ "issues": "https://github.com/iiDestiny/laravel-filesystem-oss/issues",
+ "source": "https://github.com/iiDestiny/laravel-filesystem-oss/tree/2.1"
+ },
+ "time": "2020-11-30T06:17:22+00:00"
},
{
- "name": "symfony/polyfill-mbstring",
- "version": "v1.2.0",
+ "name": "jaeger/g-http",
+ "version": "V1.7.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "dff51f72b0706335131b00a7f49606168c582594"
+ "url": "https://github.com/jae-jae/GHttp.git",
+ "reference": "611cfa6986be53d580b19472f10efaa4dde38a80"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594",
- "reference": "dff51f72b0706335131b00a7f49606168c582594",
- "shasum": ""
+ "url": "https://api.github.com/repos/jae-jae/GHttp/zipball/611cfa6986be53d580b19472f10efaa4dde38a80",
+ "reference": "611cfa6986be53d580b19472f10efaa4dde38a80",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
+ "cache/filesystem-adapter": "^1.0",
+ "guzzlehttp/guzzle": "^6.0 | ^7.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.2-dev"
- }
- },
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
+ "Jaeger\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1914,55 +2287,44 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Jaeger",
+ "email": "JaegerCode@gmail.com"
}
],
- "description": "Symfony polyfill for the Mbstring extension",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
- "time": "2016-05-18T14:26:46+00:00"
+ "description": "Simple Http client base on GuzzleHttp",
+ "support": {
+ "issues": "https://github.com/jae-jae/GHttp/issues",
+ "source": "https://github.com/jae-jae/GHttp/tree/V1.7.1"
+ },
+ "time": "2020-10-26T01:52:47+00:00"
},
{
- "name": "symfony/polyfill-php56",
- "version": "v1.2.0",
+ "name": "jaeger/phpquery-single",
+ "version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a"
+ "url": "https://github.com/jae-jae/phpQuery-single.git",
+ "reference": "fb80b4a0e5a337438d26e061ec3fb725c9f2a116"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3edf57a8fbf9a927533344cef65ad7e1cf31030a",
- "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a",
- "shasum": ""
+ "url": "https://api.github.com/repos/jae-jae/phpQuery-single/zipball/fb80b4a0e5a337438d26e061ec3fb725c9f2a116",
+ "reference": "fb80b4a0e5a337438d26e061ec3fb725c9f2a116",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3",
- "symfony/polyfill-util": "~1.0"
+ "php": ">=5.3.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.2-dev"
- }
- },
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php56\\": ""
- },
- "files": [
- "bootstrap.php"
+ "classmap": [
+ "phpQuery.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -1971,50 +2333,58 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Tobiasz Cudnik",
+ "email": "tobiasz.cudnik@gmail.com",
+ "homepage": "https://github.com/TobiaszCudnik",
+ "role": "Developer"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Jaeger",
+ "role": "Packager"
}
],
- "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "time": "2016-05-18T14:26:46+00:00"
+ "description": "phpQuery单文件版本,是Querylist的依赖(http://querylist.cc/),phpQuery项目主页:http://code.google.com/p/phpquery/",
+ "homepage": "http://code.google.com/p/phpquery/",
+ "support": {
+ "issues": "https://github.com/jae-jae/phpQuery-single/issues",
+ "source": "https://github.com/jae-jae/phpQuery-single/tree/master"
+ },
+ "time": "2019-11-05T01:50:34+00:00"
},
{
- "name": "symfony/polyfill-util",
- "version": "v1.2.0",
+ "name": "jaeger/querylist",
+ "version": "V4.1.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-util.git",
- "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99"
+ "url": "https://github.com/jae-jae/QueryList.git",
+ "reference": "46f564bc8b1a22b5dca7cd690b4af76e919b39f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99",
- "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99",
- "shasum": ""
+ "url": "https://api.github.com/repos/jae-jae/QueryList/zipball/46f564bc8b1a22b5dca7cd690b4af76e919b39f7",
+ "reference": "46f564bc8b1a22b5dca7cd690b4af76e919b39f7",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "jaeger/g-http": "^1.1",
+ "jaeger/phpquery-single": "^1",
+ "php": ">=7.0",
+ "tightenco/collect": "^5"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.2-dev"
- }
+ "require-dev": {
+ "phpunit/phpunit": "^7.5",
+ "symfony/var-dumper": "^3.3"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Util\\": ""
+ "QL\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2023,54 +2393,55 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Jaeger",
+ "email": "JaegerCode@gmail.com"
}
],
- "description": "Symfony utilities for portability of PHP codes",
- "homepage": "https://symfony.com",
+ "description": "Simple, elegant, extensible PHP Web Scraper (crawler/spider),Use the css3 dom selector,Based on phpQuery! 简洁、优雅、可扩展的PHP采集工具(爬虫),基于phpQuery。",
+ "homepage": "http://querylist.cc",
"keywords": [
- "compat",
- "compatibility",
- "polyfill",
- "shim"
+ "QueryList",
+ "phpQuery",
+ "spider"
],
- "time": "2016-05-18T14:26:46+00:00"
+ "support": {
+ "issues": "https://github.com/jae-jae/QueryList/issues",
+ "source": "https://github.com/jae-jae/QueryList/tree/master"
+ },
+ "time": "2019-02-22T07:33:54+00:00"
},
{
- "name": "symfony/process",
- "version": "v3.0.9",
+ "name": "jaeger/querylist-curl-multi",
+ "version": "4.0.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "768debc5996f599c4372b322d9061dba2a4bf505"
+ "url": "https://github.com/jae-jae/QueryList-CurlMulti.git",
+ "reference": "6f9bec5198cdafc56ffcc2e047374c76a08b153a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/768debc5996f599c4372b322d9061dba2a4bf505",
- "reference": "768debc5996f599c4372b322d9061dba2a4bf505",
- "shasum": ""
+ "url": "https://api.github.com/repos/jae-jae/QueryList-CurlMulti/zipball/6f9bec5198cdafc56ffcc2e047374c76a08b153a",
+ "reference": "6f9bec5198cdafc56ffcc2e047374c76a08b153a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9"
+ "ares333/php-curl": "^4.2",
+ "php": ">=7.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
+ "require-dev": {
+ "jaeger/querylist": "dev-master"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Process\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "QL\\Ext\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2078,68 +2449,54 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Jaeger",
+ "email": "JaegerCode@gmail.com"
}
],
- "description": "Symfony Process Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-28T11:13:34+00:00"
+ "description": "QueryList Plugin: Curl multi threading. QueryList Curl多线程插件",
+ "support": {
+ "issues": "https://github.com/jae-jae/QueryList-CurlMulti/issues",
+ "source": "https://github.com/jae-jae/QueryList-CurlMulti/tree/master"
+ },
+ "time": "2018-10-16T07:13:30+00:00"
},
{
- "name": "symfony/routing",
- "version": "v3.0.9",
+ "name": "jean85/pretty-package-versions",
+ "version": "1.6.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/routing.git",
- "reference": "9038984bd9c05ab07280121e9e10f61a7231457b"
+ "url": "https://github.com/Jean85/pretty-package-versions.git",
+ "reference": "1e0104b46f045868f11942aea058cd7186d6c303"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/9038984bd9c05ab07280121e9e10f61a7231457b",
- "reference": "9038984bd9c05ab07280121e9e10f61a7231457b",
- "shasum": ""
+ "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/1e0104b46f045868f11942aea058cd7186d6c303",
+ "reference": "1e0104b46f045868f11942aea058cd7186d6c303",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9"
- },
- "conflict": {
- "symfony/config": "<2.8"
+ "composer/package-versions-deprecated": "^1.8.0",
+ "php": "^7.0|^8.0"
},
"require-dev": {
- "doctrine/annotations": "~1.0",
- "doctrine/common": "~2.2",
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/expression-language": "~2.8|~3.0",
- "symfony/http-foundation": "~2.8|~3.0",
- "symfony/yaml": "~2.8|~3.0"
- },
- "suggest": {
- "doctrine/annotations": "For using the annotation loader",
- "symfony/config": "For using the all-in-one router or any loader",
- "symfony/dependency-injection": "For loading routes from a service",
- "symfony/expression-language": "For using expression matching",
- "symfony/http-foundation": "For using a Symfony Request object",
- "symfony/yaml": "For using the YAML loader"
+ "phpunit/phpunit": "^6.0|^8.5|^9.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\Routing\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Jean85\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2147,69 +2504,73 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Alessandro Lai",
+ "email": "alessandro.lai85@gmail.com"
}
],
- "description": "Symfony Routing Component",
- "homepage": "https://symfony.com",
+ "description": "A wrapper for ocramius/package-versions to get pretty versions strings",
"keywords": [
- "router",
- "routing",
- "uri",
- "url"
+ "composer",
+ "package",
+ "release",
+ "versions"
],
- "time": "2016-06-29T05:40:00+00:00"
+ "support": {
+ "issues": "https://github.com/Jean85/pretty-package-versions/issues",
+ "source": "https://github.com/Jean85/pretty-package-versions/tree/1.6.0"
+ },
+ "time": "2021-02-04T16:20:16+00:00"
},
{
- "name": "symfony/translation",
- "version": "v3.0.9",
+ "name": "jenssegers/mongodb",
+ "version": "v3.8.3",
"source": {
"type": "git",
- "url": "https://github.com/symfony/translation.git",
- "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26"
+ "url": "https://github.com/jenssegers/laravel-mongodb.git",
+ "reference": "09fcda8d21edfeb49416893bf916e13647d79f4b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/eee6c664853fd0576f21ae25725cfffeafe83f26",
- "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26",
- "shasum": ""
+ "url": "https://api.github.com/repos/jenssegers/laravel-mongodb/zipball/09fcda8d21edfeb49416893bf916e13647d79f4b",
+ "reference": "09fcda8d21edfeb49416893bf916e13647d79f4b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "conflict": {
- "symfony/config": "<2.8"
+ "illuminate/container": "^8.0",
+ "illuminate/database": "^8.0",
+ "illuminate/events": "^8.0",
+ "illuminate/support": "^8.0",
+ "mongodb/mongodb": "^1.6"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/intl": "~2.8|~3.0",
- "symfony/yaml": "~2.8|~3.0"
+ "doctrine/dbal": "^2.6",
+ "mockery/mockery": "^1.3.1",
+ "orchestra/testbench": "^6.0",
+ "phpunit/phpunit": "^9.0"
},
"suggest": {
- "psr/log": "To use logging capability in translator",
- "symfony/config": "",
- "symfony/yaml": ""
+ "jenssegers/mongodb-sentry": "Add Sentry support to Laravel-MongoDB",
+ "jenssegers/mongodb-session": "Add MongoDB session support to Laravel-MongoDB"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
+ "laravel": {
+ "providers": [
+ "Jenssegers\\Mongodb\\MongodbServiceProvider",
+ "Jenssegers\\Mongodb\\MongodbQueueServiceProvider"
+ ]
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Component\\Translation\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "psr-0": {
+ "Jenssegers\\Mongodb": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2217,58 +2578,188 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Jens Segers",
+ "homepage": "https://jenssegers.com"
+ }
+ ],
+ "description": "A MongoDB based Eloquent model and Query builder for Laravel (Moloquent)",
+ "homepage": "https://github.com/jenssegers/laravel-mongodb",
+ "keywords": [
+ "database",
+ "eloquent",
+ "laravel",
+ "model",
+ "moloquent",
+ "mongo",
+ "mongodb"
+ ],
+ "support": {
+ "issues": "https://github.com/jenssegers/laravel-mongodb/issues",
+ "source": "https://github.com/jenssegers/laravel-mongodb/tree/v3.8.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/jenssegers",
+ "type": "github"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "url": "https://tidelift.com/funding/github/packagist/jenssegers/mongodb",
+ "type": "tidelift"
}
],
- "description": "Symfony Translation Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-30T07:22:48+00:00"
+ "time": "2021-02-21T06:21:18+00:00"
},
{
- "name": "symfony/var-dumper",
- "version": "v3.0.9",
+ "name": "laravel/framework",
+ "version": "v8.37.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/var-dumper.git",
- "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377"
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "cf4082973abc796ec285190f0603380021f6d26f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1f7e071aafc6676fcb6e3f0497f87c2397247377",
- "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377",
- "shasum": ""
+ "url": "https://api.github.com/repos/laravel/framework/zipball/cf4082973abc796ec285190f0603380021f6d26f",
+ "reference": "cf4082973abc796ec285190f0603380021f6d26f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
+ "doctrine/inflector": "^1.4|^2.0",
+ "dragonmantank/cron-expression": "^3.0.2",
+ "egulias/email-validator": "^2.1.10",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "league/commonmark": "^1.3",
+ "league/flysystem": "^1.1",
+ "monolog/monolog": "^2.0",
+ "nesbot/carbon": "^2.31",
+ "opis/closure": "^3.6",
+ "php": "^7.3|^8.0",
+ "psr/container": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "ramsey/uuid": "^4.0",
+ "swiftmailer/swiftmailer": "^6.0",
+ "symfony/console": "^5.1.4",
+ "symfony/error-handler": "^5.1.4",
+ "symfony/finder": "^5.1.4",
+ "symfony/http-foundation": "^5.1.4",
+ "symfony/http-kernel": "^5.1.4",
+ "symfony/mime": "^5.1.4",
+ "symfony/process": "^5.1.4",
+ "symfony/routing": "^5.1.4",
+ "symfony/var-dumper": "^5.1.4",
+ "tijsverkoyen/css-to-inline-styles": "^2.2.2",
+ "vlucas/phpdotenv": "^5.2",
+ "voku/portable-ascii": "^1.4.8"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "provide": {
+ "psr/container-implementation": "1.0"
+ },
+ "replace": {
+ "illuminate/auth": "self.version",
+ "illuminate/broadcasting": "self.version",
+ "illuminate/bus": "self.version",
+ "illuminate/cache": "self.version",
+ "illuminate/collections": "self.version",
+ "illuminate/config": "self.version",
+ "illuminate/console": "self.version",
+ "illuminate/container": "self.version",
+ "illuminate/contracts": "self.version",
+ "illuminate/cookie": "self.version",
+ "illuminate/database": "self.version",
+ "illuminate/encryption": "self.version",
+ "illuminate/events": "self.version",
+ "illuminate/filesystem": "self.version",
+ "illuminate/hashing": "self.version",
+ "illuminate/http": "self.version",
+ "illuminate/log": "self.version",
+ "illuminate/macroable": "self.version",
+ "illuminate/mail": "self.version",
+ "illuminate/notifications": "self.version",
+ "illuminate/pagination": "self.version",
+ "illuminate/pipeline": "self.version",
+ "illuminate/queue": "self.version",
+ "illuminate/redis": "self.version",
+ "illuminate/routing": "self.version",
+ "illuminate/session": "self.version",
+ "illuminate/support": "self.version",
+ "illuminate/testing": "self.version",
+ "illuminate/translation": "self.version",
+ "illuminate/validation": "self.version",
+ "illuminate/view": "self.version"
},
"require-dev": {
- "twig/twig": "~1.20|~2.0"
+ "aws/aws-sdk-php": "^3.155",
+ "doctrine/dbal": "^2.6|^3.0",
+ "filp/whoops": "^2.8",
+ "guzzlehttp/guzzle": "^6.5.5|^7.0.1",
+ "league/flysystem-cached-adapter": "^1.0",
+ "mockery/mockery": "^1.4.2",
+ "orchestra/testbench-core": "^6.8",
+ "pda/pheanstalk": "^4.0",
+ "phpunit/phpunit": "^8.5.8|^9.3.3",
+ "predis/predis": "^1.1.1",
+ "symfony/cache": "^5.1.4"
},
"suggest": {
- "ext-symfony_debug": ""
+ "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.155).",
+ "brianium/paratest": "Required to run tests in parallel (^6.0).",
+ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).",
+ "ext-ftp": "Required to use the Flysystem FTP driver.",
+ "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
+ "ext-memcached": "Required to use the memcache cache driver.",
+ "ext-pcntl": "Required to use all features of the queue worker.",
+ "ext-posix": "Required to use all features of the queue worker.",
+ "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+ "filp/whoops": "Required for friendly error pages in development (^2.8).",
+ "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).",
+ "laravel/tinker": "Required to use the tinker console command (^2.0).",
+ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).",
+ "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).",
+ "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).",
+ "mockery/mockery": "Required to use mocking (^1.4.2).",
+ "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
+ "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).",
+ "phpunit/phpunit": "Required to use assertions and run tests (^8.5.8|^9.3.3).",
+ "predis/predis": "Required to use the predis connector (^1.1.2).",
+ "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
+ "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0).",
+ "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).",
+ "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).",
+ "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).",
+ "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "8.x-dev"
}
},
"autoload": {
"files": [
- "Resources/functions/dump.php"
+ "src/Illuminate/Collections/helpers.php",
+ "src/Illuminate/Events/functions.php",
+ "src/Illuminate/Foundation/helpers.php",
+ "src/Illuminate/Support/helpers.php"
],
"psr-4": {
- "Symfony\\Component\\VarDumper\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Illuminate\\": "src/Illuminate/",
+ "Illuminate\\Support\\": [
+ "src/Illuminate/Macroable/",
+ "src/Illuminate/Collections/"
+ ]
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2276,204 +2767,312 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
}
],
- "description": "Symfony mechanism for exploring and dumping PHP variables",
- "homepage": "https://symfony.com",
+ "description": "The Laravel Framework.",
+ "homepage": "https://laravel.com",
"keywords": [
- "debug",
- "dump"
+ "framework",
+ "laravel"
],
- "time": "2016-07-26T08:03:56+00:00"
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2021-04-13T13:49:49+00:00"
},
{
- "name": "tijsverkoyen/css-to-inline-styles",
- "version": "2.2.1",
+ "name": "laravel/legacy-factories",
+ "version": "v1.1.0",
"source": {
"type": "git",
- "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
- "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757"
+ "url": "https://github.com/laravel/legacy-factories.git",
+ "reference": "5e3fe2fd5fda64e20ea5c74c831a7346294e902a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757",
- "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757",
- "shasum": ""
+ "url": "https://api.github.com/repos/laravel/legacy-factories/zipball/5e3fe2fd5fda64e20ea5c74c831a7346294e902a",
+ "reference": "5e3fe2fd5fda64e20ea5c74c831a7346294e902a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": "^5.5 || ^7.0",
- "symfony/css-selector": "^2.7 || ^3.0 || ^4.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ "illuminate/macroable": "^8.0",
+ "php": "^7.3|^8.0",
+ "symfony/finder": "^3.4|^4.0|^5.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2.x-dev"
+ "dev-master": "1.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Illuminate\\Database\\Eloquent\\LegacyFactoryServiceProvider"
+ ]
}
},
"autoload": {
+ "files": [
+ "helpers.php"
+ ],
"psr-4": {
- "TijsVerkoyen\\CssToInlineStyles\\": "src"
+ "Illuminate\\Database\\Eloquent\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Tijs Verkoyen",
- "email": "css_to_inline_styles@verkoyen.eu",
- "role": "Developer"
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
}
],
- "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
- "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
- "time": "2017-11-27T11:13:29+00:00"
+ "description": "The legacy version of the Laravel Eloquent factories.",
+ "homepage": "http://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2020-10-27T14:25:32+00:00"
},
{
- "name": "vlucas/phpdotenv",
- "version": "v2.3.0",
+ "name": "laravel/ui",
+ "version": "v3.2.0",
"source": {
"type": "git",
- "url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "9ca5644c536654e9509b9d257f53c58630eb2a6a"
+ "url": "https://github.com/laravel/ui.git",
+ "reference": "a1f82c6283c8373ea1958b8a27c3d5c98cade351"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/9ca5644c536654e9509b9d257f53c58630eb2a6a",
- "reference": "9ca5644c536654e9509b9d257f53c58630eb2a6a",
- "shasum": ""
+ "url": "https://api.github.com/repos/laravel/ui/zipball/a1f82c6283c8373ea1958b8a27c3d5c98cade351",
+ "reference": "a1f82c6283c8373ea1958b8a27c3d5c98cade351",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.9"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8 || ^5.0"
+ "illuminate/console": "^8.0",
+ "illuminate/filesystem": "^8.0",
+ "illuminate/support": "^8.0",
+ "php": "^7.3|^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3-dev"
+ "dev-master": "3.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Ui\\UiServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "Dotenv\\": "src/"
+ "Laravel\\Ui\\": "src/",
+ "Illuminate\\Foundation\\Auth\\": "auth-backend/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause-Attribution"
+ "MIT"
],
"authors": [
{
- "name": "Vance Lucas",
- "email": "vance@vancelucas.com",
- "homepage": "http://www.vancelucas.com"
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
}
],
- "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+ "description": "Laravel UI utilities and presets.",
"keywords": [
- "dotenv",
- "env",
- "environment"
+ "laravel",
+ "ui"
],
- "time": "2016-06-14T14:14:52+00:00"
- }
- ],
- "packages-dev": [
+ "support": {
+ "issues": "https://github.com/laravel/ui/issues",
+ "source": "https://github.com/laravel/ui/tree/v3.2.0"
+ },
+ "time": "2021-01-06T19:20:22+00:00"
+ },
{
- "name": "doctrine/instantiator",
- "version": "1.0.5",
+ "name": "league/commonmark",
+ "version": "1.5.8",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
- "shasum": ""
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf",
+ "reference": "08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3,<8.0-DEV"
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "scrutinizer/ocular": "1.7.*"
},
"require-dev": {
- "athletic/athletic": "~0.1.8",
- "ext-pdo": "*",
- "ext-phar": "*",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~2.0"
+ "cebe/markdown": "~1.0",
+ "commonmark/commonmark.js": "0.29.2",
+ "erusev/parsedown": "~1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "~1.4",
+ "mikehaertl/php-shellcommand": "^1.4",
+ "phpstan/phpstan": "^0.12",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2",
+ "scrutinizer/ocular": "^1.5",
+ "symfony/finder": "^4.2"
},
+ "bin": [
+ "bin/commonmark"
+ ],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ "League\\CommonMark\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com",
- "homepage": "http://ocramius.github.com/"
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
}
],
- "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://github.com/doctrine/instantiator",
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
"keywords": [
- "constructor",
- "instantiate"
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/colinodell",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
],
- "time": "2015-06-14T21:17:01+00:00"
+ "time": "2021-03-28T18:51:39+00:00"
},
{
- "name": "fzaninotto/faker",
- "version": "v1.6.0",
+ "name": "league/flysystem",
+ "version": "1.1.3",
"source": {
"type": "git",
- "url": "https://github.com/fzaninotto/Faker.git",
- "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123"
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "9be3b16c877d477357c015cec057548cf9b2a14a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123",
- "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123",
- "shasum": ""
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a",
+ "reference": "9be3b16c877d477357c015cec057548cf9b2a14a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": "^5.3.3|^7.0"
+ "ext-fileinfo": "*",
+ "league/mime-type-detection": "^1.3",
+ "php": "^7.2.5 || ^8.0"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
},
"require-dev": {
- "ext-intl": "*",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~1.5"
+ "phpspec/prophecy": "^1.11.1",
+ "phpunit/phpunit": "^8.5.8"
+ },
+ "suggest": {
+ "ext-fileinfo": "Required for MimeType",
+ "ext-ftp": "Allows you to use FTP server storage",
+ "ext-openssl": "Allows you to use FTPS server storage",
+ "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+ "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+ "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+ "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+ "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+ "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+ "league/flysystem-webdav": "Allows you to use WebDAV storage",
+ "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+ "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
},
"type": "library",
"extra": {
- "branch-alias": []
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
},
"autoload": {
"psr-4": {
- "Faker\\": "src/Faker/"
+ "League\\Flysystem\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2482,158 +3081,381 @@
],
"authors": [
{
- "name": "François Zaninotto"
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
}
],
- "description": "Faker is a PHP library that generates fake data for you.",
+ "description": "Filesystem abstraction: Many filesystems, one API.",
"keywords": [
- "data",
- "faker",
- "fixtures"
+ "Cloud Files",
+ "WebDAV",
+ "abstraction",
+ "aws",
+ "cloud",
+ "copy.com",
+ "dropbox",
+ "file systems",
+ "files",
+ "filesystem",
+ "filesystems",
+ "ftp",
+ "rackspace",
+ "remote",
+ "s3",
+ "sftp",
+ "storage"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/flysystem/issues",
+ "source": "https://github.com/thephpleague/flysystem/tree/1.x"
+ },
+ "funding": [
+ {
+ "url": "https://offset.earth/frankdejonge",
+ "type": "other"
+ }
],
- "time": "2016-04-29T12:21:54+00:00"
+ "time": "2020-08-23T07:39:11+00:00"
},
{
- "name": "hamcrest/hamcrest-php",
- "version": "v1.2.2",
+ "name": "league/html-to-markdown",
+ "version": "5.0.0",
"source": {
"type": "git",
- "url": "https://github.com/hamcrest/hamcrest-php.git",
- "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
+ "url": "https://github.com/thephpleague/html-to-markdown.git",
+ "reference": "c4dbebbebe0fe454b6b38e6c683a977615bd7dc2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c",
- "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
- "shasum": ""
+ "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/c4dbebbebe0fe454b6b38e6c683a977615bd7dc2",
+ "reference": "c4dbebbebe0fe454b6b38e6c683a977615bd7dc2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.2"
+ "ext-dom": "*",
+ "ext-xml": "*",
+ "php": "^7.2.5 || ^8.0"
},
- "replace": {
- "cordoval/hamcrest-php": "*",
- "davedevelopment/hamcrest-php": "*",
- "kodova/hamcrest-php": "*"
+ "require-dev": {
+ "mikehaertl/php-shellcommand": "^1.1.0",
+ "phpstan/phpstan": "^0.12.82",
+ "phpunit/phpunit": "^8.5 || ^9.2",
+ "scrutinizer/ocular": "^1.6",
+ "unleashedtech/php-coding-standard": "^2.7",
+ "vimeo/psalm": "^4.6"
+ },
+ "bin": [
+ "bin/html-to-markdown"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\HTMLToMarkdown\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Nick Cernis",
+ "email": "nick@cern.is",
+ "homepage": "http://modernnerd.net",
+ "role": "Original Author"
+ }
+ ],
+ "description": "An HTML-to-markdown conversion helper for PHP",
+ "homepage": "https://github.com/thephpleague/html-to-markdown",
+ "keywords": [
+ "html",
+ "markdown"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/html-to-markdown/issues",
+ "source": "https://github.com/thephpleague/html-to-markdown/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/colinodell",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-03-29T01:29:08+00:00"
+ },
+ {
+ "name": "league/mime-type-detection",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/mime-type-detection.git",
+ "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
+ "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "phpunit/php-file-iterator": "1.3.3",
- "satooshi/php-coveralls": "dev-master"
+ "friendsofphp/php-cs-fixer": "^2.18",
+ "phpstan/phpstan": "^0.12.68",
+ "phpunit/phpunit": "^8.5.8 || ^9.3"
},
"type": "library",
"autoload": {
- "classmap": [
- "hamcrest"
- ],
- "files": [
- "hamcrest/Hamcrest.php"
+ "psr-4": {
+ "League\\MimeTypeDetection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "Mime-type detection for Flysystem",
+ "support": {
+ "issues": "https://github.com/thephpleague/mime-type-detection/issues",
+ "source": "https://github.com/thephpleague/mime-type-detection/tree/1.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/frankdejonge",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-18T20:58:21+00:00"
+ },
+ {
+ "name": "lyhiving/quickio",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lyhiving/quickio.git",
+ "reference": "8a1b5382640dc19534b19f8c9eab99bdad01b942"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/lyhiving/quickio/zipball/8a1b5382640dc19534b19f8c9eab99bdad01b942",
+ "reference": "8a1b5382640dc19534b19f8c9eab99bdad01b942",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
]
},
+ "require": {
+ "ext-gd": "*",
+ "php": ">=5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "lyhiving\\quickio\\": "src/"
+ }
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD"
+ "MIT"
],
- "description": "This is the PHP port of Hamcrest Matchers",
+ "authors": [
+ {
+ "name": "lyhiving",
+ "email": "lyhiving@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Quick and high performance IO read and write",
+ "homepage": "https://github.com/lyhiving/quickio",
"keywords": [
- "test"
+ "High Performance",
+ "quickio"
],
- "time": "2015-05-11T14:41:42+00:00"
+ "support": {
+ "issues": "https://github.com/lyhiving/quickio/issues",
+ "source": "https://github.com/lyhiving/quickio/tree/1.0.3"
+ },
+ "time": "2021-04-06T08:25:55+00:00"
},
{
- "name": "mockery/mockery",
- "version": "0.9.5",
+ "name": "maatwebsite/excel",
+ "version": "3.1.27",
"source": {
"type": "git",
- "url": "https://github.com/mockery/mockery.git",
- "reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2"
+ "url": "https://github.com/Maatwebsite/Laravel-Excel.git",
+ "reference": "584d65427eae4de0ba072297c8fac9b0d63dbc37"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mockery/mockery/zipball/4db079511a283e5aba1b3c2fb19037c645e70fc2",
- "reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2",
- "shasum": ""
+ "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/584d65427eae4de0ba072297c8fac9b0d63dbc37",
+ "reference": "584d65427eae4de0ba072297c8fac9b0d63dbc37",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "hamcrest/hamcrest-php": "~1.1",
- "lib-pcre": ">=7.0",
- "php": ">=5.3.2"
+ "ext-json": "*",
+ "illuminate/support": "5.8.*|^6.0|^7.0|^8.0",
+ "php": "^7.0|^8.0",
+ "phpoffice/phpspreadsheet": "^1.16"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "orchestra/testbench": "^6.0",
+ "predis/predis": "^1.1"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "0.9.x-dev"
+ "laravel": {
+ "providers": [
+ "Maatwebsite\\Excel\\ExcelServiceProvider"
+ ],
+ "aliases": {
+ "Excel": "Maatwebsite\\Excel\\Facades\\Excel"
+ }
}
},
"autoload": {
- "psr-0": {
- "Mockery": "library/"
+ "psr-4": {
+ "Maatwebsite\\Excel\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Pádraic Brady",
- "email": "padraic.brady@gmail.com",
- "homepage": "http://blog.astrumfutura.com"
- },
- {
- "name": "Dave Marshall",
- "email": "dave.marshall@atstsolutions.co.uk",
- "homepage": "http://davedevelopment.co.uk"
+ "name": "Patrick Brouwers",
+ "email": "patrick@maatwebsite.nl"
}
],
- "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
- "homepage": "http://github.com/padraic/mockery",
+ "description": "Supercharged Excel exports and imports in Laravel",
"keywords": [
- "BDD",
- "TDD",
- "library",
- "mock",
- "mock objects",
- "mockery",
- "stub",
- "test",
- "test double",
- "testing"
+ "PHPExcel",
+ "batch",
+ "csv",
+ "excel",
+ "export",
+ "import",
+ "laravel",
+ "php",
+ "phpspreadsheet"
+ ],
+ "support": {
+ "issues": "https://github.com/Maatwebsite/Laravel-Excel/issues",
+ "source": "https://github.com/Maatwebsite/Laravel-Excel/tree/3.1.27"
+ },
+ "funding": [
+ {
+ "url": "https://laravel-excel.com/commercial-support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/patrickbrouwers",
+ "type": "github"
+ }
],
- "time": "2016-05-22T21:52:33+00:00"
+ "time": "2021-02-22T16:58:19+00:00"
},
{
- "name": "phpdocumentor/reflection-common",
- "version": "1.0",
+ "name": "madnest/madzipper",
+ "version": "v1.1.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ "url": "https://github.com/madnest/madzipper.git",
+ "reference": "fd1d8199d04eac103eed9355c9bba680dcf8b89b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
- "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
- "shasum": ""
+ "url": "https://api.github.com/repos/madnest/madzipper/zipball/fd1d8199d04eac103eed9355c9bba680dcf8b89b",
+ "reference": "fd1d8199d04eac103eed9355c9bba680dcf8b89b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5"
+ "ext-zip": "*",
+ "illuminate/filesystem": "^6.18|^7.0|^8.0",
+ "illuminate/support": "^6.18|^7.0|^8.0",
+ "php": ">=7.2.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.6"
+ "mockery/mockery": "^1.3",
+ "orchestra/testbench": "^5.1",
+ "phpunit/phpunit": "^8.0|^9.0"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
+ "laravel": {
+ "providers": [
+ "Madnest\\Madzipper\\MadzipperServiceProvider"
+ ],
+ "aliases": {
+ "Madzipper": "Madnest\\Madzipper\\Madzipper"
+ }
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src"
- ]
+ "Madnest\\Madzipper\\": "src/Madnest/Madzipper"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2642,100 +3464,5645 @@
],
"authors": [
{
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
+ "name": "Jakub Theimer",
+ "email": "theimer@madne.st",
+ "homepage": "https://madne.st",
+ "role": "Developer"
}
],
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
- "keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
- ],
- "time": "2015-12-27T11:43:31+00:00"
+ "description": "Wannabe successor of Chumper/Zipper package for Laravel",
+ "support": {
+ "issues": "https://github.com/madnest/madzipper/issues",
+ "source": "https://github.com/madnest/madzipper/tree/v1.1.0"
+ },
+ "time": "2020-12-01T23:44:14+00:00"
},
{
- "name": "phpdocumentor/reflection-docblock",
- "version": "3.1.0",
+ "name": "maennchen/zipstream-php",
+ "version": "2.1.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "9270140b940ff02e58ec577c237274e92cd40cdd"
+ "url": "https://github.com/maennchen/ZipStream-PHP.git",
+ "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd",
- "reference": "9270140b940ff02e58ec577c237274e92cd40cdd",
- "shasum": ""
+ "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58",
+ "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5",
- "phpdocumentor/reflection-common": "^1.0@dev",
- "phpdocumentor/type-resolver": "^0.2.0",
- "webmozart/assert": "^1.0"
+ "myclabs/php-enum": "^1.5",
+ "php": ">= 7.1",
+ "psr/http-message": "^1.0",
+ "symfony/polyfill-mbstring": "^1.0"
},
"require-dev": {
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.4"
+ "ext-zip": "*",
+ "guzzlehttp/guzzle": ">= 6.3",
+ "mikey179/vfsstream": "^1.6",
+ "phpunit/phpunit": ">= 7.5"
},
"type": "library",
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src/"
- ]
+ "ZipStream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
+ "authors": [
+ {
+ "name": "Paul Duncan",
+ "email": "pabs@pablotron.org"
+ },
+ {
+ "name": "Jonatan Männchen",
+ "email": "jonatan@maennchen.ch"
+ },
+ {
+ "name": "Jesse Donat",
+ "email": "donatj@gmail.com"
+ },
+ {
+ "name": "András Kolesár",
+ "email": "kolesar@kolesar.hu"
+ }
+ ],
+ "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+ "keywords": [
+ "stream",
+ "zip"
+ ],
+ "support": {
+ "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
+ "source": "https://github.com/maennchen/ZipStream-PHP/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/zipstream",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2020-05-30T13:11:16+00:00"
+ },
+ {
+ "name": "markbaker/complex",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MarkBaker/PHPComplex.git",
+ "reference": "9999f1432fae467bc93c53f357105b4c31bb994c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/9999f1432fae467bc93c53f357105b4c31bb994c",
+ "reference": "9999f1432fae467bc93c53f357105b4c31bb994c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "phpcompatibility/php-compatibility": "^9.0",
+ "phpdocumentor/phpdocumentor": "2.*",
+ "phploc/phploc": "^4.0",
+ "phpmd/phpmd": "2.*",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3",
+ "sebastian/phpcpd": "^4.0",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Complex\\": "classes/src/"
+ },
+ "files": [
+ "classes/src/functions/abs.php",
+ "classes/src/functions/acos.php",
+ "classes/src/functions/acosh.php",
+ "classes/src/functions/acot.php",
+ "classes/src/functions/acoth.php",
+ "classes/src/functions/acsc.php",
+ "classes/src/functions/acsch.php",
+ "classes/src/functions/argument.php",
+ "classes/src/functions/asec.php",
+ "classes/src/functions/asech.php",
+ "classes/src/functions/asin.php",
+ "classes/src/functions/asinh.php",
+ "classes/src/functions/atan.php",
+ "classes/src/functions/atanh.php",
+ "classes/src/functions/conjugate.php",
+ "classes/src/functions/cos.php",
+ "classes/src/functions/cosh.php",
+ "classes/src/functions/cot.php",
+ "classes/src/functions/coth.php",
+ "classes/src/functions/csc.php",
+ "classes/src/functions/csch.php",
+ "classes/src/functions/exp.php",
+ "classes/src/functions/inverse.php",
+ "classes/src/functions/ln.php",
+ "classes/src/functions/log2.php",
+ "classes/src/functions/log10.php",
+ "classes/src/functions/negative.php",
+ "classes/src/functions/pow.php",
+ "classes/src/functions/rho.php",
+ "classes/src/functions/sec.php",
+ "classes/src/functions/sech.php",
+ "classes/src/functions/sin.php",
+ "classes/src/functions/sinh.php",
+ "classes/src/functions/sqrt.php",
+ "classes/src/functions/tan.php",
+ "classes/src/functions/tanh.php",
+ "classes/src/functions/theta.php",
+ "classes/src/operations/add.php",
+ "classes/src/operations/subtract.php",
+ "classes/src/operations/multiply.php",
+ "classes/src/operations/divideby.php",
+ "classes/src/operations/divideinto.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Baker",
+ "email": "mark@lange.demon.co.uk"
+ }
+ ],
+ "description": "PHP Class for working with complex numbers",
+ "homepage": "https://github.com/MarkBaker/PHPComplex",
+ "keywords": [
+ "complex",
+ "mathematics"
+ ],
+ "support": {
+ "issues": "https://github.com/MarkBaker/PHPComplex/issues",
+ "source": "https://github.com/MarkBaker/PHPComplex/tree/PHP8"
+ },
+ "time": "2020-08-26T10:42:07+00:00"
+ },
+ {
+ "name": "markbaker/matrix",
+ "version": "2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MarkBaker/PHPMatrix.git",
+ "reference": "361c0f545c3172ee26c3d596a0aa03f0cef65e6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/361c0f545c3172ee26c3d596a0aa03f0cef65e6a",
+ "reference": "361c0f545c3172ee26c3d596a0aa03f0cef65e6a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "phpcompatibility/php-compatibility": "^9.0",
+ "phpdocumentor/phpdocumentor": "2.*",
+ "phploc/phploc": "^4.0",
+ "phpmd/phpmd": "2.*",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3",
+ "sebastian/phpcpd": "^4.0",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matrix\\": "classes/src/"
+ },
+ "files": [
+ "classes/src/Functions/adjoint.php",
+ "classes/src/Functions/antidiagonal.php",
+ "classes/src/Functions/cofactors.php",
+ "classes/src/Functions/determinant.php",
+ "classes/src/Functions/diagonal.php",
+ "classes/src/Functions/identity.php",
+ "classes/src/Functions/inverse.php",
+ "classes/src/Functions/minors.php",
+ "classes/src/Functions/trace.php",
+ "classes/src/Functions/transpose.php",
+ "classes/src/Operations/add.php",
+ "classes/src/Operations/directsum.php",
+ "classes/src/Operations/subtract.php",
+ "classes/src/Operations/multiply.php",
+ "classes/src/Operations/divideby.php",
+ "classes/src/Operations/divideinto.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Baker",
+ "email": "mark@demon-angel.eu"
+ }
+ ],
+ "description": "PHP Class for working with matrices",
+ "homepage": "https://github.com/MarkBaker/PHPMatrix",
+ "keywords": [
+ "mathematics",
+ "matrix",
+ "vector"
+ ],
+ "support": {
+ "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
+ "source": "https://github.com/MarkBaker/PHPMatrix/tree/2.1.2"
+ },
+ "time": "2021-01-23T16:37:31+00:00"
+ },
+ {
+ "name": "mongodb/mongodb",
+ "version": "1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mongodb/mongo-php-library.git",
+ "reference": "953dbc19443aa9314c44b7217a16873347e6840d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/953dbc19443aa9314c44b7217a16873347e6840d",
+ "reference": "953dbc19443aa9314c44b7217a16873347e6840d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-hash": "*",
+ "ext-json": "*",
+ "ext-mongodb": "^1.8.1",
+ "jean85/pretty-package-versions": "^1.2",
+ "php": "^7.0 || ^8.0",
+ "symfony/polyfill-php80": "^1.19"
+ },
+ "require-dev": {
+ "squizlabs/php_codesniffer": "^3.5, <3.5.5",
+ "symfony/phpunit-bridge": "5.x-dev"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "MongoDB\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Braun",
+ "email": "andreas.braun@mongodb.com"
+ },
+ {
+ "name": "Jeremy Mikola",
+ "email": "jmikola@gmail.com"
+ }
+ ],
+ "description": "MongoDB driver library",
+ "homepage": "https://jira.mongodb.org/browse/PHPLIB",
+ "keywords": [
+ "database",
+ "driver",
+ "mongodb",
+ "persistence"
+ ],
+ "support": {
+ "issues": "https://github.com/mongodb/mongo-php-library/issues",
+ "source": "https://github.com/mongodb/mongo-php-library/tree/1.8.0"
+ },
+ "time": "2020-11-25T12:26:02+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084",
+ "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2",
+ "psr/log": "^1.0.1"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7",
+ "graylog2/gelf-php": "^1.4.2",
+ "mongodb/mongodb": "^1.8",
+ "php-amqplib/php-amqplib": "~2.4",
+ "php-console/php-console": "^3.1.3",
+ "phpspec/prophecy": "^1.6.1",
+ "phpstan/phpstan": "^0.12.59",
+ "phpunit/phpunit": "^8.5",
+ "predis/predis": "^1.1",
+ "rollbar/rollbar": "^1.3",
+ "ruflin/elastica": ">=0.90 <7.0.1",
+ "swiftmailer/swiftmailer": "^5.3|^6.0"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "php-console/php-console": "Allow sending log messages to Google Chrome",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/2.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-14T13:15:25+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-13T09:40:50+00:00"
+ },
+ {
+ "name": "myclabs/php-enum",
+ "version": "1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/php-enum.git",
+ "reference": "46cf3d8498b095bd33727b13fd5707263af99421"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/php-enum/zipball/46cf3d8498b095bd33727b13fd5707263af99421",
+ "reference": "46cf3d8498b095bd33727b13fd5707263af99421",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.3 || ^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5",
+ "squizlabs/php_codesniffer": "1.*",
+ "vimeo/psalm": "^4.5.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "MyCLabs\\Enum\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP Enum contributors",
+ "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
+ }
+ ],
+ "description": "PHP Enum implementation",
+ "homepage": "http://github.com/myclabs/php-enum",
+ "keywords": [
+ "enum"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/php-enum/issues",
+ "source": "https://github.com/myclabs/php-enum/tree/1.8.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/mnapoli",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-15T16:11:48+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "2.46.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4",
+ "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1.8 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^3.4 || ^4.0 || ^5.0"
+ },
+ "require-dev": {
+ "doctrine/orm": "^2.7",
+ "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
+ "kylekatarnls/multi-tester": "^2.0",
+ "phpmd/phpmd": "^2.9",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.54",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.14",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-3.x": "3.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "http://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "http://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/briannesbitt/Carbon/issues",
+ "source": "https://github.com/briannesbitt/Carbon"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-24T17:30:44+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.10.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4"
+ },
+ "time": "2020-12-20T10:01:03+00:00"
+ },
+ {
+ "name": "nunomaduro/collision",
+ "version": "v5.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "41b7e9999133d5082700d31a1d0977161df8322a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/41b7e9999133d5082700d31a1d0977161df8322a",
+ "reference": "41b7e9999133d5082700d31a1d0977161df8322a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "facade/ignition-contracts": "^1.0",
+ "filp/whoops": "^2.7.2",
+ "php": "^7.3 || ^8.0",
+ "symfony/console": "^5.0"
+ },
+ "require-dev": {
+ "brianium/paratest": "^6.1",
+ "fideloper/proxy": "^4.4.1",
+ "friendsofphp/php-cs-fixer": "^2.17.3",
+ "fruitcake/laravel-cors": "^2.0.3",
+ "laravel/framework": "^9.0",
+ "nunomaduro/larastan": "^0.6.2",
+ "nunomaduro/mock-final-classes": "^1.0",
+ "orchestra/testbench": "^7.0",
+ "phpstan/phpstan": "^0.12.64",
+ "phpunit/phpunit": "^9.5.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "NunoMaduro\\Collision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Cli error handling for console/command-line PHP applications.",
+ "keywords": [
+ "artisan",
+ "cli",
+ "command-line",
+ "console",
+ "error",
+ "handling",
+ "laravel",
+ "laravel-zero",
+ "php",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/collision/issues",
+ "source": "https://github.com/nunomaduro/collision"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-04-09T13:38:32+00:00"
+ },
+ {
+ "name": "opis/closure",
+ "version": "3.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/opis/closure.git",
+ "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6",
+ "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.4 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "jeremeamia/superclosure": "^2.0",
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Opis\\Closure\\": "src/"
+ },
+ "files": [
+ "functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marius Sarca",
+ "email": "marius.sarca@gmail.com"
+ },
+ {
+ "name": "Sorin Sarca",
+ "email": "sarca_sorin@hotmail.com"
+ }
+ ],
+ "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
+ "homepage": "https://opis.io/closure",
+ "keywords": [
+ "anonymous functions",
+ "closure",
+ "function",
+ "serializable",
+ "serialization",
+ "serialize"
+ ],
+ "support": {
+ "issues": "https://github.com/opis/closure/issues",
+ "source": "https://github.com/opis/closure/tree/3.6.2"
+ },
+ "time": "2021-04-09T13:42:10+00:00"
+ },
+ {
+ "name": "overtrue/flysystem-cos",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/flysystem-cos.git",
+ "reference": "efa7578f0a497bfa53bb065ba7d4b66a8cf810f0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/overtrue/flysystem-cos/zipball/efa7578f0a497bfa53bb065ba7d4b66a8cf810f0",
+ "reference": "efa7578f0a497bfa53bb065ba7d4b66a8cf810f0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "league/flysystem": "^1.0",
+ "overtrue/qcloud-cos-client": "^1.0.0",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "brainmaestro/composer-git-hooks": "^2.7",
+ "friendsofphp/php-cs-fixer": "^2.15",
+ "mockery/mockery": "~1.0",
+ "phpunit/phpunit": "~9"
+ },
+ "type": "library",
+ "extra": {
+ "hooks": {
+ "pre-commit": [
+ "composer test",
+ "composer check-style"
+ ],
+ "pre-push": [
+ "composer test",
+ "composer check-style"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\Flysystem\\Cos\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "i@overtrue.me"
+ }
+ ],
+ "description": "Flysystem adapter for the QCloud COS storage.",
+ "support": {
+ "issues": "https://github.com/overtrue/flysystem-cos/issues",
+ "source": "https://github.com/overtrue/flysystem-cos/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://www.easywechat.com/img/pay/wechat.jpg",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/overtrue",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-03-04T11:44:05+00:00"
+ },
+ {
+ "name": "overtrue/laravel-filesystem-cos",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/laravel-filesystem-cos.git",
+ "reference": "0d6c94bdc46edbb0d6001985e5552f1375bfb3d8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/overtrue/laravel-filesystem-cos/zipball/0d6c94bdc46edbb0d6001985e5552f1375bfb3d8",
+ "reference": "0d6c94bdc46edbb0d6001985e5552f1375bfb3d8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "league/flysystem": "^1.0",
+ "overtrue/flysystem-cos": "^3.0.0",
+ "php": ">=7.4"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Overtrue\\LaravelFilesystem\\Cos\\CosStorageServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\LaravelFilesystem\\Cos\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "i@overtrue.me"
+ }
+ ],
+ "description": "A Cos storage filesystem for Laravel.",
+ "support": {
+ "issues": "https://github.com/overtrue/laravel-filesystem-cos/issues",
+ "source": "https://github.com/overtrue/laravel-filesystem-cos/tree/2.0.0"
+ },
+ "time": "2020-10-30T07:38:23+00:00"
+ },
+ {
+ "name": "overtrue/qcloud-cos-client",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/qcloud-cos-client.git",
+ "reference": "d6019d1462f4d854a5aff970d11637d35ff4e164"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/overtrue/qcloud-cos-client/zipball/d6019d1462f4d854a5aff970d11637d35ff4e164",
+ "reference": "d6019d1462f4d854a5aff970d11637d35ff4e164",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-simplexml": "*",
+ "guzzlehttp/guzzle": "^7.2",
+ "php": ">=7.4",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "brainmaestro/composer-git-hooks": "^2.7",
+ "friendsofphp/php-cs-fixer": "^2.15",
+ "mockery/mockery": "^1.0",
+ "monolog/monolog": "^2.1",
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "hooks": {
+ "pre-commit": [
+ "composer test",
+ "composer check-style"
+ ],
+ "pre-push": [
+ "composer test",
+ "composer check-style"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\CosClient\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "anzhengchao@gmail.com"
+ }
+ ],
+ "description": "Client of QCloud.com COS",
+ "support": {
+ "issues": "https://github.com/overtrue/qcloud-cos-client/issues",
+ "source": "https://github.com/overtrue/qcloud-cos-client/tree/1.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.easywechat.com/img/pay/wechat.jpg",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/overtrue",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-10-30T07:12:55+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/master"
+ },
+ "time": "2020-06-27T14:33:11+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.1.0"
+ },
+ "time": "2021-02-23T14:00:09+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
+ },
+ "time": "2020-09-03T19:13:55+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
+ },
+ "time": "2020-09-17T18:55:26+00:00"
+ },
+ {
+ "name": "phpoffice/phpspreadsheet",
+ "version": "1.17.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+ "reference": "c55269cb06911575a126dc225a05c0e4626e5fb4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/c55269cb06911575a126dc225a05c0e4626e5fb4",
+ "reference": "c55269cb06911575a126dc225a05c0e4626e5fb4",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-dom": "*",
+ "ext-fileinfo": "*",
+ "ext-gd": "*",
+ "ext-iconv": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "ext-xml": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "ext-zip": "*",
+ "ext-zlib": "*",
+ "ezyang/htmlpurifier": "^4.13",
+ "maennchen/zipstream-php": "^2.1",
+ "markbaker/complex": "^1.5||^2.0",
+ "markbaker/matrix": "^1.2||^2.0",
+ "php": "^7.2||^8.0",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "require-dev": {
+ "dompdf/dompdf": "^0.8.5",
+ "friendsofphp/php-cs-fixer": "^2.18",
+ "jpgraph/jpgraph": "^4.0",
+ "mpdf/mpdf": "^8.0",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpunit/phpunit": "^8.5||^9.3",
+ "squizlabs/php_codesniffer": "^3.5",
+ "tecnickcom/tcpdf": "^6.3"
+ },
+ "suggest": {
+ "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
+ "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+ "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+ "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maarten Balliauw",
+ "homepage": "https://blog.maartenballiauw.be"
+ },
+ {
+ "name": "Mark Baker",
+ "homepage": "https://markbakeruk.net"
+ },
+ {
+ "name": "Franck Lefevre",
+ "homepage": "https://rootslabs.net"
+ },
+ {
+ "name": "Erik Tilt"
+ },
+ {
+ "name": "Adrien Crivelli"
+ }
+ ],
+ "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+ "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+ "keywords": [
+ "OpenXML",
+ "excel",
+ "gnumeric",
+ "ods",
+ "php",
+ "spreadsheet",
+ "xls",
+ "xlsx"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
+ "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.17.1"
+ },
+ "time": "2021-03-02T17:54:11+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.7.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525",
+ "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpOption\\": "src/PhpOption/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "Option Type for PHP",
+ "keywords": [
+ "language",
+ "option",
+ "php",
+ "type"
+ ],
+ "support": {
+ "issues": "https://github.com/schmittjoh/php-option/issues",
+ "source": "https://github.com/schmittjoh/php-option/tree/1.7.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-20T17:29:33+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea",
+ "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2",
+ "php": "^7.2 || ~8.0, <8.1",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "sebastian/comparator": "^3.0 || ^4.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^6.0",
+ "phpunit/phpunit": "^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/1.13.0"
+ },
+ "time": "2021-03-17T13:42:18+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "f6293e1b30a2354e8428e004689671b83871edde"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde",
+ "reference": "f6293e1b30a2354e8428e004689671b83871edde",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.10.2",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-28T07:26:59+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:57:25+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.5.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "c73c6737305e779771147af66c96ca6a7ed8a741"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c73c6737305e779771147af66c96ca6a7ed8a741",
+ "reference": "c73c6737305e779771147af66c96ca6a7ed8a741",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.1",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpspec/prophecy": "^1.12.1",
+ "phpunit/php-code-coverage": "^9.2.3",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.5",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.3",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^2.3",
+ "sebastian/version": "^3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*",
+ "phpspec/prophecy-phpunit": "^2.0.1"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.5-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ],
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/donate.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-23T07:16:29+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/master"
+ },
+ "time": "2016-08-06T20:24:11+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/1.1.1"
+ },
+ "time": "2021-03-05T17:36:06+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client/tree/master"
+ },
+ "time": "2020-06-29T06:28:15+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/master"
+ },
+ "time": "2019-04-30T12:38:16+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/master"
+ },
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.3"
+ },
+ "time": "2020-03-23T09:12:05+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/simple-cache/tree/master"
+ },
+ "time": "2017-10-23T01:57:42+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "ramsey/collection",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1",
+ "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "ergebnis/composer-normalize": "^2.6",
+ "fakerphp/faker": "^1.5",
+ "hamcrest/hamcrest-php": "^2",
+ "jangregor/phpstan-prophecy": "^0.8",
+ "mockery/mockery": "^1.3",
+ "phpstan/extension-installer": "^1",
+ "phpstan/phpstan": "^0.12.32",
+ "phpstan/phpstan-mockery": "^0.12.5",
+ "phpstan/phpstan-phpunit": "^0.12.11",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "psy/psysh": "^0.10.4",
+ "slevomat/coding-standard": "^6.3",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A PHP 7.2+ library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/collection/issues",
+ "source": "https://github.com/ramsey/collection/tree/1.1.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-21T17:40:04+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "cd4032040a750077205918c86049aa0f43d22947"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947",
+ "reference": "cd4032040a750077205918c86049aa0f43d22947",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "brick/math": "^0.8 || ^0.9",
+ "ext-json": "*",
+ "php": "^7.2 || ^8",
+ "ramsey/collection": "^1.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "codeception/aspect-mock": "^3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "goaop/framework": "^2",
+ "mockery/mockery": "^1.3",
+ "moontoast/math": "^1.1",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-mock/php-mock-phpunit": "^2.5",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^0.17.1",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-mockery": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^8.5",
+ "psy/psysh": "^0.10.0",
+ "slevomat/coding-standard": "^6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "3.9.4"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-ctype": "Enables faster processing of character classification using ctype functions.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "homepage": "https://github.com/ramsey/uuid",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/uuid/issues",
+ "rss": "https://github.com/ramsey/uuid/releases.atom",
+ "source": "https://github.com/ramsey/uuid"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ }
+ ],
+ "time": "2020-08-18T17:17:46+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:49:45+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:52:38+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:24:23+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:55:19+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:17:30+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/2.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:18:59+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "swiftmailer/swiftmailer",
+ "version": "v6.2.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/swiftmailer/swiftmailer.git",
+ "reference": "15f7faf8508e04471f666633addacf54c0ab5933"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/15f7faf8508e04471f666633addacf54c0ab5933",
+ "reference": "15f7faf8508e04471f666633addacf54c0ab5933",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "egulias/email-validator": "^2.0|^3.1",
+ "php": ">=7.0.0",
+ "symfony/polyfill-iconv": "^1.0",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "symfony/phpunit-bridge": "^4.4|^5.0"
+ },
+ "suggest": {
+ "ext-intl": "Needed to support internationalized email addresses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/swift_required.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Corbyn"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Swiftmailer, free feature-rich PHP mailer",
+ "homepage": "https://swiftmailer.symfony.com",
+ "keywords": [
+ "email",
+ "mail",
+ "mailer"
+ ],
+ "support": {
+ "issues": "https://github.com/swiftmailer/swiftmailer/issues",
+ "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.2.7"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-03-09T12:30:35+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/35f039df40a3b335ebf310f244cb242b3a83ac8d",
+ "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.8",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/string": "^5.1"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^4.4|^5.0",
+ "symfony/lock": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/var-dumper": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-03-28T09:42:18+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v3.4.47",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/da3d9da2ce0026771f5fe64cb332158f1bd2bc33",
+ "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/css-selector/tree/v3.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-24T10:57:07+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665",
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "bdb7fb4188da7f4211e4b88350ba0dfdad002b03"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/bdb7fb4188da7f4211e4b88350ba0dfdad002b03",
+ "reference": "bdb7fb4188da7f4211e4b88350ba0dfdad002b03",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/log": "^1.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/var-dumper": "^4.4|^5.0"
+ },
+ "require-dev": {
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/http-kernel": "^4.4|^5.0",
+ "symfony/serializer": "^4.4|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-03-16T09:07:47+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v5.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "d08d6ec121a425897951900ab692b612a61d6240"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d08d6ec121a425897951900ab692b612a61d6240",
+ "reference": "d08d6ec121a425897951900ab692b612a61d6240",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/event-dispatcher-contracts": "^2",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/http-foundation": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/stopwatch": "^4.4|^5.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-18T17:12:37+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2",
+ "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/event-dispatcher": "^1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v5.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "0d639a0943822626290d169965804f79400e6a04"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04",
+ "reference": "0d639a0943822626290d169965804f79400e6a04",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v5.2.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-15T18:55:04+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "41db680a15018f9c1d4b23516059633ce280ca33"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33",
+ "reference": "41db680a15018f9c1d4b23516059633ce280ca33",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/http-client-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-version": "2.3",
+ "branch-alias": {
+ "dev-main": "2.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-14T17:08:19+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v5.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf",
+ "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "require-dev": {
+ "predis/predis": "~1.0",
+ "symfony/cache": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/mime": "^4.4|^5.0"
+ },
+ "suggest": {
+ "symfony/mime": "To use the file extension guesser"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Defines an object-oriented layer for the HTTP specification",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-foundation/tree/v5.2.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-25T17:16:57+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "f34de4c61ca46df73857f7f36b9a3805bdd7e3b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f34de4c61ca46df73857f7f36b9a3805bdd7e3b2",
+ "reference": "f34de4c61ca46df73857f7f36b9a3805bdd7e3b2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/log": "~1.0",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^5.0",
+ "symfony/http-client-contracts": "^1.1|^2",
+ "symfony/http-foundation": "^4.4|^5.0",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<4.4",
+ "symfony/cache": "<5.0",
+ "symfony/config": "<5.0",
+ "symfony/console": "<4.4",
+ "symfony/dependency-injection": "<5.1.8",
+ "symfony/doctrine-bridge": "<5.0",
+ "symfony/form": "<5.0",
+ "symfony/http-client": "<5.0",
+ "symfony/mailer": "<5.0",
+ "symfony/messenger": "<5.0",
+ "symfony/translation": "<5.0",
+ "symfony/twig-bridge": "<5.0",
+ "symfony/validator": "<5.0",
+ "twig/twig": "<2.13"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^4.4|^5.0",
+ "symfony/config": "^5.0",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/css-selector": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.1.8",
+ "symfony/dom-crawler": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/finder": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/routing": "^4.4|^5.0",
+ "symfony/stopwatch": "^4.4|^5.0",
+ "symfony/translation": "^4.4|^5.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a structured process for converting a Request into a Response",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-kernel/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-03-29T05:16:58+00:00"
+ },
+ {
+ "name": "symfony/mime",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mime.git",
+ "reference": "1b2092244374cbe48ae733673f2ca0818b37197b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/1b2092244374cbe48ae733673f2ca0818b37197b",
+ "reference": "1b2092244374cbe48ae733673f2ca0818b37197b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "egulias/email-validator": "~3.0.0",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/mailer": "<4.4"
+ },
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10|^3.1",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/property-access": "^4.4|^5.1",
+ "symfony/property-info": "^4.4|^5.1",
+ "symfony/serializer": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mime\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows manipulating MIME messages",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mime",
+ "mime-type"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/mime/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-03-12T13:18:39+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-07T16:49:33+00:00"
+ },
+ {
+ "name": "symfony/polyfill-iconv",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-iconv.git",
+ "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/06fb361659649bcfd6a208a0f1fcaf4e827ad342",
+ "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-iconv": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Iconv\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Iconv extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "iconv",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-iconv/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170",
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "2d63434d922daf7da8dd863e7907e67ee3031483"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483",
+ "reference": "2d63434d922daf7da8dd863e7907e67ee3031483",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1",
+ "symfony/polyfill-intl-normalizer": "^1.10",
+ "symfony/polyfill-php72": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248",
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9",
+ "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-07T16:49:33+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php73",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
+ "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1"
+ },
+ "funding": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "time": "2016-06-10T09:48:41+00:00"
+ "time": "2021-01-07T16:49:33+00:00"
},
{
- "name": "phpdocumentor/type-resolver",
- "version": "0.2",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.22.1",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
- "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5",
- "phpdocumentor/reflection-common": "^1.0"
- },
- "require-dev": {
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^5.2||^4.8.24"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src/"
- ]
- }
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2743,46 +9110,77 @@
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "time": "2016-06-10T07:14:17+00:00"
+ "time": "2021-01-07T16:49:33+00:00"
},
{
- "name": "phpspec/prophecy",
- "version": "v1.6.1",
+ "name": "symfony/process",
+ "version": "v5.2.4",
"source": {
"type": "git",
- "url": "https://github.com/phpspec/prophecy.git",
- "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+ "url": "https://github.com/symfony/process.git",
+ "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
- "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/process/zipball/313a38f09c77fbcdc1d223e57d368cea76a2fd2f",
+ "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "doctrine/instantiator": "^1.0.2",
- "php": "^5.3|^7.0",
- "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
- "sebastian/comparator": "^1.1",
- "sebastian/recursion-context": "^1.0"
- },
- "require-dev": {
- "phpspec/phpspec": "^2.0"
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.15"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.6.x-dev"
- }
- },
"autoload": {
- "psr-0": {
- "Prophecy\\": "src/"
- }
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2790,374 +9188,609 @@
],
"authors": [
{
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
- "name": "Marcello Duarte",
- "email": "marcello.duarte@gmail.com"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Highly opinionated mocking framework for PHP 5.3+",
- "homepage": "https://github.com/phpspec/prophecy",
- "keywords": [
- "Double",
- "Dummy",
- "fake",
- "mock",
- "spy",
- "stub"
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v5.2.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
],
- "time": "2016-06-07T08:13:47+00:00"
+ "time": "2021-01-27T10:15:41+00:00"
},
{
- "name": "phpunit/php-code-coverage",
- "version": "2.2.4",
+ "name": "symfony/routing",
+ "version": "v5.2.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "31fba555f178afd04d54fd26953501b2c3f0c6e6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
- "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/routing/zipball/31fba555f178afd04d54fd26953501b2c3f0c6e6",
+ "reference": "31fba555f178afd04d54fd26953501b2c3f0c6e6",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3",
- "phpunit/php-file-iterator": "~1.3",
- "phpunit/php-text-template": "~1.2",
- "phpunit/php-token-stream": "~1.3",
- "sebastian/environment": "^1.3.2",
- "sebastian/version": "~1.0"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/config": "<5.0",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/yaml": "<4.4"
},
"require-dev": {
- "ext-xdebug": ">=2.1.4",
- "phpunit/phpunit": "~4"
+ "doctrine/annotations": "^1.10.4",
+ "psr/log": "~1.0",
+ "symfony/config": "^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/http-foundation": "^4.4|^5.0",
+ "symfony/yaml": "^4.4|^5.0"
},
"suggest": {
- "ext-dom": "*",
- "ext-xdebug": ">=2.2.1",
- "ext-xmlwriter": "*"
+ "doctrine/annotations": "For using the annotation loader",
+ "symfony/config": "For using the all-in-one router or any loader",
+ "symfony/expression-language": "For using expression matching",
+ "symfony/http-foundation": "For using a Symfony Request object",
+ "symfony/yaml": "For using the YAML loader"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.2.x-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
- "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "description": "Maps an HTTP request to a set of configuration variables",
+ "homepage": "https://symfony.com",
"keywords": [
- "coverage",
- "testing",
- "xunit"
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/routing/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
],
- "time": "2015-10-06T15:47:00+00:00"
+ "time": "2021-03-14T13:53:33+00:00"
},
{
- "name": "phpunit/php-file-iterator",
- "version": "1.4.1",
+ "name": "symfony/service-contracts",
+ "version": "v2.2.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
- "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.2.5",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4.x-dev"
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "FilterIterator implementation that filters files based on a list of suffixes.",
- "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
"keywords": [
- "filesystem",
- "iterator"
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
],
- "time": "2015-06-21T13:08:43+00:00"
+ "time": "2020-09-07T11:33:47+00:00"
},
{
- "name": "phpunit/php-text-template",
- "version": "1.2.1",
+ "name": "symfony/string",
+ "version": "v5.2.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ "url": "https://github.com/symfony/string.git",
+ "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/string/zipball/ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572",
+ "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/http-client": "^4.4|^5.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0"
},
"type": "library",
"autoload": {
- "classmap": [
- "src/"
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "files": [
+ "Resources/functions.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Simple template engine.",
- "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
"keywords": [
- "template"
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
],
- "time": "2015-06-21T13:50:34+00:00"
+ "time": "2021-03-17T17:12:15+00:00"
},
{
- "name": "phpunit/php-timer",
- "version": "1.0.8",
+ "name": "symfony/translation",
+ "version": "v5.2.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "2cc7f45d96db9adfcf89adf4401d9dfed509f4e1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
- "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/translation/zipball/2cc7f45d96db9adfcf89adf4401d9dfed509f4e1",
+ "reference": "2cc7f45d96db9adfcf89adf4401d9dfed509f4e1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/translation-contracts": "^2.3"
+ },
+ "conflict": {
+ "symfony/config": "<4.4",
+ "symfony/dependency-injection": "<5.0",
+ "symfony/http-kernel": "<5.0",
+ "symfony/twig-bundle": "<5.0",
+ "symfony/yaml": "<4.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3"
},
"require-dev": {
- "phpunit/phpunit": "~4|~5"
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.0",
+ "symfony/finder": "^4.4|^5.0",
+ "symfony/http-kernel": "^5.0",
+ "symfony/intl": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
},
"type": "library",
"autoload": {
- "classmap": [
- "src/"
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Utility class for timing",
- "homepage": "https://github.com/sebastianbergmann/php-timer/",
- "keywords": [
- "timer"
+ "description": "Provides tools to internationalize your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
],
- "time": "2016-05-12T18:03:57+00:00"
+ "time": "2021-03-23T19:33:48+00:00"
},
{
- "name": "phpunit/php-token-stream",
- "version": "1.4.8",
+ "name": "symfony/translation-contracts",
+ "version": "v2.3.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
- "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "ext-tokenizer": "*",
- "php": ">=5.3.3"
+ "php": ">=7.2.5"
},
- "require-dev": {
- "phpunit/phpunit": "~4.2"
+ "suggest": {
+ "symfony/translation-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "2.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Wrapper around PHP's tokenizer extension.",
- "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
"keywords": [
- "tokenizer"
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
],
- "time": "2015-09-15T10:49:45+00:00"
+ "time": "2020-09-28T13:05:58+00:00"
},
{
- "name": "phpunit/phpunit",
- "version": "4.8.27",
+ "name": "symfony/var-dumper",
+ "version": "v5.2.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90"
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "89412a68ea2e675b4e44f260a5666729f77f668e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c062dddcb68e44b563f66ee319ddae2b5a322a90",
- "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/89412a68ea2e675b4e44f260a5666729f77f668e",
+ "reference": "89412a68ea2e675b4e44f260a5666729f77f668e",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "ext-dom": "*",
- "ext-json": "*",
- "ext-pcre": "*",
- "ext-reflection": "*",
- "ext-spl": "*",
- "php": ">=5.3.3",
- "phpspec/prophecy": "^1.3.1",
- "phpunit/php-code-coverage": "~2.1",
- "phpunit/php-file-iterator": "~1.4",
- "phpunit/php-text-template": "~1.2",
- "phpunit/php-timer": "^1.0.6",
- "phpunit/phpunit-mock-objects": "~2.3",
- "sebastian/comparator": "~1.1",
- "sebastian/diff": "~1.2",
- "sebastian/environment": "~1.3",
- "sebastian/exporter": "~1.2",
- "sebastian/global-state": "~1.0",
- "sebastian/version": "~1.0",
- "symfony/yaml": "~2.1|~3.0"
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/console": "<4.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "twig/twig": "^2.13|^3.0.4"
},
"suggest": {
- "phpunit/php-invoker": "~1.1"
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
},
"bin": [
- "phpunit"
+ "Resources/bin/var-dump-server"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.8.x-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "The PHP Unit Testing framework.",
- "homepage": "https://phpunit.de/",
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
"keywords": [
- "phpunit",
- "testing",
- "xunit"
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v5.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
],
- "time": "2016-07-21T06:48:14+00:00"
+ "time": "2021-03-28T09:42:18+00:00"
},
{
- "name": "phpunit/phpunit-mock-objects",
- "version": "2.3.8",
+ "name": "theseer/tokenizer",
+ "version": "1.2.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
- "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
- "shasum": ""
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "doctrine/instantiator": "^1.0.2",
- "php": ">=5.3.3",
- "phpunit/php-text-template": "~1.2",
- "sebastian/exporter": "~1.2"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.4"
- },
- "suggest": {
- "ext-soap": "*"
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.3.x-dev"
- }
- },
"autoload": {
"classmap": [
"src/"
@@ -3169,113 +9802,123 @@
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
}
],
- "description": "Mock Object library for PHPUnit",
- "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
- "keywords": [
- "mock",
- "xunit"
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
],
- "time": "2015-10-02T06:51:40+00:00"
+ "time": "2020-07-12T23:59:07+00:00"
},
{
- "name": "sebastian/comparator",
- "version": "1.2.0",
+ "name": "tightenco/collect",
+ "version": "v5.6.33",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+ "url": "https://github.com/tighten/collect.git",
+ "reference": "d7381736dca44ac17d0805a25191b094e5a22446"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
- "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
- "shasum": ""
+ "url": "https://api.github.com/repos/tighten/collect/zipball/d7381736dca44ac17d0805a25191b094e5a22446",
+ "reference": "d7381736dca44ac17d0805a25191b094e5a22446",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3",
- "sebastian/diff": "~1.2",
- "sebastian/exporter": "~1.2"
+ "php": ">=7.1.3",
+ "symfony/var-dumper": ">=3.1.10"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "mockery/mockery": "~1.0",
+ "nesbot/carbon": "~1.20",
+ "phpunit/phpunit": "~7.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.2.x-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
- ]
+ "files": [
+ "src/Collect/Support/helpers.php",
+ "src/Collect/Support/alias.php"
+ ],
+ "psr-4": {
+ "Tightenco\\Collect\\": "src/Collect"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Volker Dusch",
- "email": "github@wallbash.com"
- },
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Taylor Otwell",
+ "email": "taylorotwell@gmail.com"
}
],
- "description": "Provides the functionality to compare PHP values for equality",
- "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "description": "Collect - Illuminate Collections as a separate package.",
"keywords": [
- "comparator",
- "compare",
- "equality"
+ "collection",
+ "laravel"
],
- "time": "2015-07-26T15:48:44+00:00"
+ "support": {
+ "issues": "https://github.com/tighten/collect/issues",
+ "source": "https://github.com/tighten/collect/tree/v5.6.33"
+ },
+ "time": "2018-08-09T16:56:26+00:00"
},
{
- "name": "sebastian/diff",
- "version": "1.4.1",
+ "name": "tijsverkoyen/css-to-inline-styles",
+ "version": "2.2.3",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+ "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
- "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
- "shasum": ""
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5",
+ "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": "^5.5 || ^7.0 || ^8.0",
+ "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.8"
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "2.2.x-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "TijsVerkoyen\\CssToInlineStyles\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3283,51 +9926,66 @@
],
"authors": [
{
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Tijs Verkoyen",
+ "email": "css_to_inline_styles@verkoyen.eu",
+ "role": "Developer"
}
],
- "description": "Diff implementation",
- "homepage": "https://github.com/sebastianbergmann/diff",
- "keywords": [
- "diff"
- ],
- "time": "2015-12-08T07:14:41+00:00"
+ "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+ "support": {
+ "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
+ "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.3"
+ },
+ "time": "2020-07-13T06:12:54+00:00"
},
{
- "name": "sebastian/environment",
- "version": "1.3.7",
+ "name": "vlucas/phpdotenv",
+ "version": "v5.3.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
- "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
- "shasum": ""
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
+ "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.0.1",
+ "php": "^7.1.3 || ^8.0",
+ "phpoption/phpoption": "^1.7.4",
+ "symfony/polyfill-ctype": "^1.17",
+ "symfony/polyfill-mbstring": "^1.17",
+ "symfony/polyfill-php80": "^1.17"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5.1"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3.x-dev"
+ "dev-master": "5.3-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Dotenv\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3335,307 +9993,410 @@
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "homepage": "https://gjcampbell.co.uk/"
+ },
+ {
+ "name": "Vance Lucas",
+ "email": "vance@vancelucas.com",
+ "homepage": "https://vancelucas.com/"
}
],
- "description": "Provides functionality to handle HHVM/PHP environments",
- "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
"keywords": [
- "Xdebug",
- "environment",
- "hhvm"
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "issues": "https://github.com/vlucas/phpdotenv/issues",
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
],
- "time": "2016-05-17T03:18:57+00:00"
+ "time": "2021-01-20T15:23:13+00:00"
},
{
- "name": "sebastian/exporter",
- "version": "1.2.2",
+ "name": "voku/portable-ascii",
+ "version": "1.5.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "80953678b19901e5165c56752d087fc11526017c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
- "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
- "shasum": ""
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
+ "reference": "80953678b19901e5165c56752d087fc11526017c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3",
- "sebastian/recursion-context": "~1.0"
+ "php": ">=7.0.0"
},
"require-dev": {
- "ext-mbstring": "*",
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3.x-dev"
- }
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
},
- "autoload": {
- "classmap": [
- "src/"
- ]
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/portable-ascii/issues",
+ "source": "https://github.com/voku/portable-ascii/tree/1.5.6"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
},
{
- "name": "Volker Dusch",
- "email": "github@wallbash.com"
+ "url": "https://github.com/voku",
+ "type": "github"
},
{
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
},
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
},
{
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
}
],
- "description": "Provides the functionality to export PHP variables for visualization",
- "homepage": "http://www.github.com/sebastianbergmann/exporter",
- "keywords": [
- "export",
- "exporter"
- ],
- "time": "2016-06-17T09:04:28+00:00"
+ "time": "2020-11-12T00:07:28+00:00"
},
{
- "name": "sebastian/global-state",
- "version": "1.1.1",
+ "name": "webmozart/assert",
+ "version": "1.10.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
- "shasum": ""
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.2 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
},
- "require-dev": {
- "phpunit/phpunit": "~4.2"
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
},
- "suggest": {
- "ext-uopz": "*"
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.10-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
}
],
- "description": "Snapshotting of global state",
- "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "description": "Assertions to validate method input/output with nice error messages.",
"keywords": [
- "global state"
+ "assert",
+ "check",
+ "validate"
],
- "time": "2015-10-12T03:26:01+00:00"
- },
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.10.0"
+ },
+ "time": "2021-03-09T10:59:23+00:00"
+ }
+ ],
+ "packages-dev": [
{
- "name": "sebastian/recursion-context",
- "version": "1.0.2",
+ "name": "fzaninotto/faker",
+ "version": "v1.9.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
+ "url": "https://github.com/fzaninotto/Faker.git",
+ "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
- "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
- "shasum": ""
+ "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
+ "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.3.3"
+ "php": "^5.3.3 || ^7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "ext-intl": "*",
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
+ "squizlabs/php_codesniffer": "^2.9.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
+ "name": "François Zaninotto"
}
],
- "description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
- "time": "2015-11-11T19:50:13+00:00"
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "support": {
+ "issues": "https://github.com/fzaninotto/Faker/issues",
+ "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2"
+ },
+ "abandoned": true,
+ "time": "2020-12-11T09:56:16+00:00"
},
{
- "name": "sebastian/version",
- "version": "1.0.6",
+ "name": "hamcrest/hamcrest-php",
+ "version": "v1.2.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/version.git",
- "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
- "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
- "shasum": ""
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c",
+ "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "1.3.3",
+ "satooshi/php-coveralls": "dev-master"
},
"type": "library",
"autoload": {
"classmap": [
- "src/"
+ "hamcrest"
+ ],
+ "files": [
+ "hamcrest/Hamcrest.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "BSD"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
],
- "description": "Library that helps with managing the version number of Git-hosted PHP projects",
- "homepage": "https://github.com/sebastianbergmann/version",
- "time": "2015-06-21T13:59:46+00:00"
+ "support": {
+ "issues": "https://github.com/hamcrest/hamcrest-php/issues",
+ "source": "https://github.com/hamcrest/hamcrest-php/tree/master"
+ },
+ "time": "2015-05-11T14:41:42+00:00"
},
{
- "name": "symfony/dom-crawler",
- "version": "v3.0.9",
+ "name": "mockery/mockery",
+ "version": "0.9.11",
"source": {
"type": "git",
- "url": "https://github.com/symfony/dom-crawler.git",
- "reference": "dff8fecf1f56990d88058e3a1885c2a5f1b8e970"
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "be9bf28d8e57d67883cba9fcadfcff8caab667f8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/dff8fecf1f56990d88058e3a1885c2a5f1b8e970",
- "reference": "dff8fecf1f56990d88058e3a1885c2a5f1b8e970",
- "shasum": ""
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/be9bf28d8e57d67883cba9fcadfcff8caab667f8",
+ "reference": "be9bf28d8e57d67883cba9fcadfcff8caab667f8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
+ "hamcrest/hamcrest-php": "~1.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=5.3.2"
},
"require-dev": {
- "symfony/css-selector": "~2.8|~3.0"
- },
- "suggest": {
- "symfony/css-selector": ""
+ "phpunit/phpunit": "~4.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "0.9.x-dev"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Component\\DomCrawler\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "psr-0": {
+ "Mockery": "library/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "http://blog.astrumfutura.com"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "http://davedevelopment.co.uk"
}
],
- "description": "Symfony DomCrawler Component",
- "homepage": "https://symfony.com",
- "time": "2016-07-30T07:22:48+00:00"
+ "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
+ "homepage": "http://github.com/padraic/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/mockery/mockery/issues",
+ "source": "https://github.com/mockery/mockery/tree/0.9"
+ },
+ "time": "2019-02-12T16:07:13+00:00"
},
{
- "name": "symfony/yaml",
- "version": "v3.1.3",
+ "name": "symfony/dom-crawler",
+ "version": "v3.4.47",
"source": {
"type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "1819adf2066880c7967df7180f4f662b6f0567ac"
+ "url": "https://github.com/symfony/dom-crawler.git",
+ "reference": "ef97bcfbae5b384b4ca6c8d57b617722f15241a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/1819adf2066880c7967df7180f4f662b6f0567ac",
- "reference": "1819adf2066880c7967df7180f4f662b6f0567ac",
- "shasum": ""
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ef97bcfbae5b384b4ca6c8d57b617722f15241a6",
+ "reference": "ef97bcfbae5b384b4ca6c8d57b617722f15241a6",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
- "php": ">=5.5.9"
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
- }
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0|~4.0"
+ },
+ "suggest": {
+ "symfony/css-selector": ""
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Yaml\\": ""
+ "Symfony\\Component\\DomCrawler\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -3655,58 +10416,26 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Yaml Component",
+ "description": "Symfony DomCrawler Component",
"homepage": "https://symfony.com",
- "time": "2016-07-17T14:02:08+00:00"
- },
- {
- "name": "webmozart/assert",
- "version": "1.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/webmozart/assert.git",
- "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde",
- "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde",
- "shasum": ""
+ "support": {
+ "source": "https://github.com/symfony/dom-crawler/tree/v3.4.47"
},
- "require": {
- "php": ">=5.3.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.6"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Webmozart\\Assert\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
+ "funding": [
{
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "description": "Assertions to validate method input/output with nice error messages.",
- "keywords": [
- "assert",
- "check",
- "validate"
- ],
- "time": "2015-08-24T13:29:44+00:00"
+ "time": "2020-10-24T10:57:07+00:00"
}
],
"aliases": [],
@@ -3715,7 +10444,8 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
- "php": ">=5.5.9"
+ "php": "^7.3.0"
},
- "platform-dev": []
+ "platform-dev": [],
+ "plugin-api-version": "2.0.0"
}
diff --git a/config.sh b/config.sh
old mode 100644
new mode 100755
index 92750f8c9..0b36aee6a
--- a/config.sh
+++ b/config.sh
@@ -12,6 +12,11 @@ export eloquentpersistencefile=vendor/cartalyst/sentinel/src/Persistences/Eloque
export eloquentthrottlefile=vendor/cartalyst/sentinel/src/Throttling/EloquentThrottle.php
export eloquentrolefile=vendor/cartalyst/sentinel/src/Roles/EloquentRole.php
export eloquentreminderfile=vendor/cartalyst/sentinel/src/Reminders/EloquentReminder.php
+export eloquentreminderrepositoryinterfacefile=vendor/cartalyst/sentinel/src/Reminders/ReminderRepositoryInterface.php
+export cartalystsentinelusersuserinterface=vendor/cartalyst/sentinel/src/Users/UserInterface.php
+export cartalystsentineluserseloquentuser=vendor/cartalyst/sentinel/src/Users/EloquentUser.php
+export cartalystsentinelusersilluminateuserrepository=vendor/cartalyst/sentinel/src/Users/IlluminateUserRepository.php
+export cartalystsentinelrolesilluminaterolerepository=vendor/cartalyst/sentinel/src/Roles/IlluminateRoleRepository.php
sed -i 's/Illuminate\\Database\\Eloquent\\Model/Jenssegers\\Mongodb\\Eloquent\\Model/g' $eloquentuserfile
sed -i 's/Illuminate\\Database\\Eloquent\\Model/Jenssegers\\Mongodb\\Eloquent\\Model/g' $eloquentactivationfile
@@ -19,12 +24,24 @@ sed -i 's/Illuminate\\Database\\Eloquent\\Model/Jenssegers\\Mongodb\\Eloquent\\M
sed -i 's/Illuminate\\Database\\Eloquent\\Model/Jenssegers\\Mongodb\\Eloquent\\Model/g' $eloquentthrottlefile
sed -i 's/Illuminate\\Database\\Eloquent\\Model/Jenssegers\\Mongodb\\Eloquent\\Model/g' $eloquentrolefile
sed -i 's/Illuminate\\Database\\Eloquent\\Model/Jenssegers\\Mongodb\\Eloquent\\Model/g' $eloquentreminderfile
+sed -i 's/Illuminate\\Database\\Eloquent\\Model/Jenssegers\\Mongodb\\Eloquent\\Model/g' $eloquentreminderrepositoryinterfacefile
+sed -i 's/getUserId(): int/getUserId(): string/g' $cartalystsentinelusersuserinterface
+sed -i 's/getUserId(): int/getUserId(): string/g' $cartalystsentineluserseloquentuser
+sed -i 's/findById(int /findById(/g' $cartalystsentinelusersilluminateuserrepository
+sed -i 's/findById(int /findById(/g' $cartalystsentinelrolesilluminaterolerepository
+
+
#initialize activition's completed
export activationrepofile=vendor/cartalyst/sentinel/src/Activations/IlluminateActivationRepository.php
if [ `grep -c '$activation->completed = false;' $activationrepofile` -eq 0 ]; then
sed -i '/$activation->user_id = $user->getUserId();/a\ $activation->completed = false;' $activationrepofile
fi
+
+#fix getAuthIdentifier function
+if [ `grep -c 'function getAuthIdentifier()' $cartalystsentineluserseloquentuser` -eq 0 ]; then
+ sed -i '/public function getPersistableId(): string/c\ public function getAuthIdentifier(){return $this->getUserId();}\r\n \ public function getPersistableId(): string' $cartalystsentineluserseloquentuser
+fi
#add avatar field to fillable
if [ `grep -c "'avatar'," $eloquentuserfile` -eq 0 ]; then
diff --git a/config/app.php b/config/app.php
old mode 100644
new mode 100755
index 75bcce08a..9dedede08
--- a/config/app.php
+++ b/config/app.php
@@ -163,7 +163,14 @@
Maatwebsite\Excel\ExcelServiceProvider::class,
- Chumper\Zipper\ZipperServiceProvider::class,
+ /**
+ * cos,oss
+ */
+ Iidestiny\LaravelFilesystemOss\OssStorageServiceProvider::class,
+ Overtrue\LaravelFilesystem\Cos\CosStorageServiceProvider::class,
+
+ //ziper
+ Madnest\Madzipper\MadzipperServiceProvider::class
],
/*
@@ -214,7 +221,7 @@
'Reminder' => Cartalyst\Sentinel\Laravel\Facades\Reminder::class,
'Sentinel' => Cartalyst\Sentinel\Laravel\Facades\Sentinel::class,
- 'Zipper' => Chumper\Zipper\Zipper::class,
+ 'Zipper' => Madnest\Madzipper\Madzipper::class,
],
];
diff --git a/config/auth.php b/config/auth.php
index 3fa7f491b..ba1a4d8cb 100644
--- a/config/auth.php
+++ b/config/auth.php
@@ -44,6 +44,7 @@
'api' => [
'driver' => 'token',
'provider' => 'users',
+ 'hash' => false,
],
],
@@ -67,7 +68,7 @@
'providers' => [
'users' => [
'driver' => 'eloquent',
- 'model' => App\User::class,
+ 'model' => App\Models\User::class,
],
// 'users' => [
@@ -81,10 +82,6 @@
| Resetting Passwords
|--------------------------------------------------------------------------
|
- | Here you may set the options for resetting passwords including the view
- | that is your password reset e-mail. You may also set the name of the
- | table that maintains all of the reset tokens for your application.
- |
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
@@ -98,10 +95,23 @@
'passwords' => [
'users' => [
'provider' => 'users',
- 'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
+ 'throttle' => 60,
],
],
+ /*
+ |--------------------------------------------------------------------------
+ | Password Confirmation Timeout
+ |--------------------------------------------------------------------------
+ |
+ | Here you may define the amount of seconds before a password confirmation
+ | times out and the user is prompted to re-enter their password via the
+ | confirmation screen. By default, the timeout lasts for three hours.
+ |
+ */
+
+ 'password_timeout' => 10800,
+
];
diff --git a/config/broadcasting.php b/config/broadcasting.php
index bf8b2dfee..2d529820c 100644
--- a/config/broadcasting.php
+++ b/config/broadcasting.php
@@ -11,11 +11,11 @@
| framework when an event needs to be broadcast. You may set this to
| any of the connections defined in the "connections" array below.
|
- | Supported: "pusher", "redis", "log"
+ | Supported: "pusher", "ably", "redis", "log", "null"
|
*/
- 'default' => env('BROADCAST_DRIVER', 'pusher'),
+ 'default' => env('BROADCAST_DRIVER', 'null'),
/*
|--------------------------------------------------------------------------
@@ -32,14 +32,20 @@
'pusher' => [
'driver' => 'pusher',
- 'key' => env('PUSHER_KEY'),
- 'secret' => env('PUSHER_SECRET'),
+ 'key' => env('PUSHER_APP_KEY'),
+ 'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
- //
+ 'cluster' => env('PUSHER_APP_CLUSTER'),
+ 'useTLS' => true,
],
],
+ 'ably' => [
+ 'driver' => 'ably',
+ 'key' => env('ABLY_KEY'),
+ ],
+
'redis' => [
'driver' => 'redis',
'connection' => 'default',
@@ -49,6 +55,10 @@
'driver' => 'log',
],
+ 'null' => [
+ 'driver' => 'null',
+ ],
+
],
];
diff --git a/config/cache.php b/config/cache.php
index 6b8ac9141..e32a2fd3b 100644
--- a/config/cache.php
+++ b/config/cache.php
@@ -1,5 +1,7 @@
env('CACHE_DRIVER', 'file'),
@@ -26,6 +26,9 @@
| well as their drivers. You may even define multiple stores for the
| same cache driver to group types of items stored in your caches.
|
+ | Supported drivers: "apc", "array", "database", "file",
+ | "memcached", "redis", "dynamodb", "null"
+ |
*/
'stores' => [
@@ -36,21 +39,31 @@
'array' => [
'driver' => 'array',
+ 'serialize' => false,
],
'database' => [
'driver' => 'database',
'table' => 'cache',
'connection' => null,
+ 'lock_connection' => null,
],
'file' => [
'driver' => 'file',
- 'path' => storage_path('framework/cache'),
+ 'path' => storage_path('framework/cache/data'),
],
'memcached' => [
'driver' => 'memcached',
+ 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
+ 'sasl' => [
+ env('MEMCACHED_USERNAME'),
+ env('MEMCACHED_PASSWORD'),
+ ],
+ 'options' => [
+ // Memcached::OPT_CONNECT_TIMEOUT => 2000,
+ ],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
@@ -62,7 +75,17 @@
'redis' => [
'driver' => 'redis',
- 'connection' => 'default',
+ 'connection' => 'cache',
+ 'lock_connection' => 'default',
+ ],
+
+ 'dynamodb' => [
+ 'driver' => 'dynamodb',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
+ 'endpoint' => env('DYNAMODB_ENDPOINT'),
],
],
@@ -78,6 +101,6 @@
|
*/
- 'prefix' => 'laravel',
+ 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
];
diff --git a/config/compile.php b/config/compile.php
old mode 100644
new mode 100755
diff --git a/config/cors.php b/config/cors.php
new file mode 100644
index 000000000..8a39e6daa
--- /dev/null
+++ b/config/cors.php
@@ -0,0 +1,34 @@
+ ['api/*', 'sanctum/csrf-cookie'],
+
+ 'allowed_methods' => ['*'],
+
+ 'allowed_origins' => ['*'],
+
+ 'allowed_origins_patterns' => [],
+
+ 'allowed_headers' => ['*'],
+
+ 'exposed_headers' => [],
+
+ 'max_age' => 0,
+
+ 'supports_credentials' => false,
+
+];
diff --git a/config/database.php b/config/database.php
index 6fe03b385..c538f3434 100644
--- a/config/database.php
+++ b/config/database.php
@@ -1,19 +1,8 @@
PDO::FETCH_CLASS,
+return [
/*
|--------------------------------------------------------------------------
@@ -48,34 +37,45 @@
'sqlite' => [
'driver' => 'sqlite',
+ 'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
+ 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
'mysql' => [
'driver' => 'mysql',
- 'host' => env('DB_HOST', 'localhost'),
+ 'url' => env('DATABASE_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
- 'charset' => 'utf8',
- 'collation' => 'utf8_unicode_ci',
+ 'unix_socket' => env('DB_SOCKET', ''),
+ 'charset' => 'utf8mb4',
+ 'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
- 'strict' => false,
+ 'prefix_indexes' => true,
+ 'strict' => true,
'engine' => null,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
],
'pgsql' => [
'driver' => 'pgsql',
- 'host' => env('DB_HOST', 'localhost'),
+ 'url' => env('DATABASE_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
+ 'prefix_indexes' => true,
'schema' => 'public',
+ 'sslmode' => 'prefer',
],
'mongodb' => [
@@ -90,6 +90,19 @@
)
],
+ 'sqlsrv' => [
+ 'driver' => 'sqlsrv',
+ 'url' => env('DATABASE_URL'),
+ 'host' => env('DB_HOST', 'localhost'),
+ 'port' => env('DB_PORT', '1433'),
+ 'database' => env('DB_DATABASE', 'forge'),
+ 'username' => env('DB_USERNAME', 'forge'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => 'utf8',
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ ],
+
],
/*
@@ -111,20 +124,34 @@
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
- | provides a richer set of commands than a typical key-value systems
+ | provides a richer body of commands than a typical key-value system
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
*/
'redis' => [
- 'cluster' => false,
+ 'client' => env('REDIS_CLIENT', 'phpredis'),
+
+ 'options' => [
+ 'cluster' => env('REDIS_CLUSTER', 'redis'),
+ 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
+ ],
'default' => [
- 'host' => env('REDIS_HOST', 'localhost'),
+ 'url' => env('REDIS_URL'),
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'password' => env('REDIS_PASSWORD', null),
+ 'port' => env('REDIS_PORT', '6379'),
+ 'database' => env('REDIS_DB', '0'),
+ ],
+
+ 'cache' => [
+ 'url' => env('REDIS_URL'),
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
- 'port' => env('REDIS_PORT', 6379),
- 'database' => 0,
+ 'port' => env('REDIS_PORT', '6379'),
+ 'database' => env('REDIS_CACHE_DB', '1'),
],
],
diff --git a/config/filesystems.php b/config/filesystems.php
index 75b50022b..f3d598766 100644
--- a/config/filesystems.php
+++ b/config/filesystems.php
@@ -1,5 +1,7 @@
'local',
-
- /*
- |--------------------------------------------------------------------------
- | Default Cloud Filesystem Disk
- |--------------------------------------------------------------------------
- |
- | Many applications store files both locally and in the cloud. For this
- | reason, you may specify a default "cloud" driver here. This driver
- | will be bound as the Cloud disk implementation in the container.
+ | by the framework. The "local" disk, as well as a variety of cloud
+ | based disks are available to your application. Just store away!
|
*/
- 'cloud' => 's3',
+ 'default' => env('FILESYSTEM_DRIVER', 'local'),
/*
|--------------------------------------------------------------------------
@@ -39,6 +26,8 @@
| may even configure multiple disks of the same driver. Defaults have
| been setup for each driver as an example of the required options.
|
+ | Supported Drivers: "local", "ftp", "sftp", "s3"
+ |
*/
'disks' => [
@@ -51,17 +40,35 @@
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
+ 'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
- 'key' => 'your-key',
- 'secret' => 'your-secret',
- 'region' => 'your-region',
- 'bucket' => 'your-bucket',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION'),
+ 'bucket' => env('AWS_BUCKET'),
+ 'url' => env('AWS_URL'),
+ 'endpoint' => env('AWS_ENDPOINT'),
],
],
+ /*
+ |--------------------------------------------------------------------------
+ | Symbolic Links
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the symbolic links that will be created when the
+ | `storage:link` Artisan command is executed. The array keys should be
+ | the locations of the links and the values should be their targets.
+ |
+ */
+
+ 'links' => [
+ public_path('storage') => storage_path('app/public'),
+ ],
+
];
diff --git a/config/hashing.php b/config/hashing.php
new file mode 100644
index 000000000..842577087
--- /dev/null
+++ b/config/hashing.php
@@ -0,0 +1,52 @@
+ 'bcrypt',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Bcrypt Options
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the configuration options that should be used when
+ | passwords are hashed using the Bcrypt algorithm. This will allow you
+ | to control the amount of time it takes to hash the given password.
+ |
+ */
+
+ 'bcrypt' => [
+ 'rounds' => env('BCRYPT_ROUNDS', 10),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Argon Options
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the configuration options that should be used when
+ | passwords are hashed using the Argon algorithm. These will allow you
+ | to control the amount of time it takes to hash the given password.
+ |
+ */
+
+ 'argon' => [
+ 'memory' => 1024,
+ 'threads' => 2,
+ 'time' => 2,
+ ],
+
+];
diff --git a/config/logging.php b/config/logging.php
new file mode 100644
index 000000000..1aa06aa30
--- /dev/null
+++ b/config/logging.php
@@ -0,0 +1,105 @@
+ env('LOG_CHANNEL', 'stack'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Log Channels
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the log channels for your application. Out of
+ | the box, Laravel uses the Monolog PHP logging library. This gives
+ | you a variety of powerful log handlers / formatters to utilize.
+ |
+ | Available Drivers: "single", "daily", "slack", "syslog",
+ | "errorlog", "monolog",
+ | "custom", "stack"
+ |
+ */
+
+ 'channels' => [
+ 'stack' => [
+ 'driver' => 'stack',
+ 'channels' => ['single'],
+ 'ignore_exceptions' => false,
+ ],
+
+ 'single' => [
+ 'driver' => 'single',
+ 'path' => storage_path('logs/laravel.log'),
+ 'level' => env('LOG_LEVEL', 'debug'),
+ ],
+
+ 'daily' => [
+ 'driver' => 'daily',
+ 'path' => storage_path('logs/laravel.log'),
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'days' => 14,
+ ],
+
+ 'slack' => [
+ 'driver' => 'slack',
+ 'url' => env('LOG_SLACK_WEBHOOK_URL'),
+ 'username' => 'Laravel Log',
+ 'emoji' => ':boom:',
+ 'level' => env('LOG_LEVEL', 'critical'),
+ ],
+
+ 'papertrail' => [
+ 'driver' => 'monolog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'handler' => SyslogUdpHandler::class,
+ 'handler_with' => [
+ 'host' => env('PAPERTRAIL_URL'),
+ 'port' => env('PAPERTRAIL_PORT'),
+ ],
+ ],
+
+ 'stderr' => [
+ 'driver' => 'monolog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'handler' => StreamHandler::class,
+ 'formatter' => env('LOG_STDERR_FORMATTER'),
+ 'with' => [
+ 'stream' => 'php://stderr',
+ ],
+ ],
+
+ 'syslog' => [
+ 'driver' => 'syslog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ ],
+
+ 'errorlog' => [
+ 'driver' => 'errorlog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ ],
+
+ 'null' => [
+ 'driver' => 'monolog',
+ 'handler' => NullHandler::class,
+ ],
+
+ 'emergency' => [
+ 'path' => storage_path('logs/laravel.log'),
+ ],
+ ],
+
+];
diff --git a/config/mail.php b/config/mail.php
old mode 100644
new mode 100755
diff --git a/config/queue.php b/config/queue.php
index b4ae7965f..25ea5a819 100644
--- a/config/queue.php
+++ b/config/queue.php
@@ -4,18 +4,16 @@
/*
|--------------------------------------------------------------------------
- | Default Queue Driver
+ | Default Queue Connection Name
|--------------------------------------------------------------------------
|
- | The Laravel queue API supports a variety of back-ends via an unified
+ | Laravel's queue API supports an assortment of back-ends via a single
| API, giving you convenient access to each back-end using the same
- | syntax for each one. Here you may set the default queue driver.
- |
- | Supported: "null", "sync", "database", "beanstalkd", "sqs", "redis"
+ | syntax for every one. Here you may define a default connection.
|
*/
- 'default' => env('QUEUE_DRIVER', 'sync'),
+ 'default' => env('QUEUE_CONNECTION', 'sync'),
/*
|--------------------------------------------------------------------------
@@ -26,6 +24,8 @@
| is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more.
|
+ | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
+ |
*/
'connections' => [
@@ -38,30 +38,37 @@
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
- 'expire' => 90,
+ 'retry_after' => 90,
+ 'after_commit' => false,
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
- 'ttr' => 90,
+ 'retry_after' => 90,
+ 'block_for' => 0,
+ 'after_commit' => false,
],
'sqs' => [
'driver' => 'sqs',
- 'key' => 'your-public-key',
- 'secret' => 'your-secret-key',
- 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
- 'queue' => 'your-queue-name',
- 'region' => 'us-east-1',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
+ 'queue' => env('SQS_QUEUE', 'default'),
+ 'suffix' => env('SQS_SUFFIX'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ 'after_commit' => false,
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
- 'queue' => 'default',
- 'expire' => 90,
+ 'queue' => env('REDIS_QUEUE', 'default'),
+ 'retry_after' => 90,
+ 'block_for' => null,
+ 'after_commit' => false,
],
],
@@ -78,6 +85,7 @@
*/
'failed' => [
+ 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],
diff --git a/config/services.php b/config/services.php
old mode 100644
new mode 100755
index 1581f1dbf..9b33fdbb5
--- a/config/services.php
+++ b/config/services.php
@@ -34,7 +34,7 @@
],
'stripe' => [
- 'model' => App\User::class,
+ 'model' => App\Models\User::class,
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
],
diff --git a/config/session.php b/config/session.php
index d042c7066..4e0f66cda 100644
--- a/config/session.php
+++ b/config/session.php
@@ -1,5 +1,7 @@
120,
+ 'lifetime' => env('SESSION_LIFETIME', 120),
- 'expire_on_close' => true,
+ 'expire_on_close' => false,
/*
|--------------------------------------------------------------------------
@@ -70,7 +72,7 @@
|
*/
- 'connection' => null,
+ 'connection' => env('SESSION_CONNECTION', null),
/*
|--------------------------------------------------------------------------
@@ -85,6 +87,21 @@
'table' => 'sessions',
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cache Store
+ |--------------------------------------------------------------------------
+ |
+ | While using one of the framework's cache driven session backends you may
+ | list a cache store that should be used for these sessions. This value
+ | must match with one of the application's configured cache "stores".
+ |
+ | Affects: "apc", "dynamodb", "memcached", "redis"
+ |
+ */
+
+ 'store' => env('SESSION_STORE', null),
+
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
@@ -109,7 +126,10 @@
|
*/
- 'cookie' => 'laravel_session',
+ 'cookie' => env(
+ 'SESSION_COOKIE',
+ Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
+ ),
/*
|--------------------------------------------------------------------------
@@ -135,8 +155,7 @@
|
*/
- //'domain' => env('SESSION_DOMAIN', null),
- 'domain' => null,
+ 'domain' => env('SESSION_DOMAIN', null),
/*
|--------------------------------------------------------------------------
@@ -149,7 +168,7 @@
|
*/
- 'secure' => false,
+ 'secure' => env('SESSION_SECURE_COOKIE'),
/*
|--------------------------------------------------------------------------
@@ -164,4 +183,19 @@
'http_only' => true,
+ /*
+ |--------------------------------------------------------------------------
+ | Same-Site Cookies
+ |--------------------------------------------------------------------------
+ |
+ | This option determines how your cookies behave when cross-site requests
+ | take place, and can be used to mitigate CSRF attacks. By default, we
+ | will set this value to "lax" since this is a secure default value.
+ |
+ | Supported: "lax", "strict", "none", null
+ |
+ */
+
+ 'same_site' => 'lax',
+
];
diff --git a/config/setting.php b/config/setting.php
new file mode 100755
index 000000000..8b6218d22
--- /dev/null
+++ b/config/setting.php
@@ -0,0 +1,10 @@
+ env('APP_URL', 'http://localhost'),
+ 'erpapi' => env('APP_URL', 'http://localhost'),
+
+];
diff --git a/config/view.php b/config/view.php
index e193ab61d..22b8a18d3 100644
--- a/config/view.php
+++ b/config/view.php
@@ -14,7 +14,7 @@
*/
'paths' => [
- realpath(base_path('resources/views')),
+ resource_path('views'),
],
/*
@@ -28,6 +28,9 @@
|
*/
- 'compiled' => realpath(storage_path('framework/views')),
+ 'compiled' => env(
+ 'VIEW_COMPILED_PATH',
+ realpath(storage_path('framework/views'))
+ ),
];
diff --git a/database/.gitignore b/database/.gitignore
old mode 100644
new mode 100755
diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php
old mode 100644
new mode 100755
index f596d0b59..50d6c588a
--- a/database/factories/ModelFactory.php
+++ b/database/factories/ModelFactory.php
@@ -11,7 +11,7 @@
|
*/
-$factory->define(App\User::class, function (Faker\Generator $faker) {
+$factory->define(App\Models\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->safeEmail,
diff --git a/database/migrations/.gitkeep b/database/migrations/.gitkeep
old mode 100644
new mode 100755
diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php
old mode 100644
new mode 100755
diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php
old mode 100644
new mode 100755
diff --git a/database/seeds/.gitkeep b/database/seeds/.gitkeep
old mode 100644
new mode 100755
diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
old mode 100644
new mode 100755
diff --git a/dbdata/acl_role.bson b/dbdata/acl_role.bson
old mode 100644
new mode 100755
diff --git a/dbdata/acl_role.metadata.json b/dbdata/acl_role.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/acl_role_permissions.bson b/dbdata/acl_role_permissions.bson
old mode 100644
new mode 100755
diff --git a/dbdata/acl_role_permissions.metadata.json b/dbdata/acl_role_permissions.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/activations.bson b/dbdata/activations.bson
old mode 100644
new mode 100755
diff --git a/dbdata/activations.metadata.json b/dbdata/activations.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_calendar_singular.bson b/dbdata/config_calendar_singular.bson
old mode 100644
new mode 100755
diff --git a/dbdata/config_calendar_singular.metadata.json b/dbdata/config_calendar_singular.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_event_notifications.bson b/dbdata/config_event_notifications.bson
old mode 100644
new mode 100755
diff --git a/dbdata/config_event_notifications.metadata.json b/dbdata/config_event_notifications.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_events.bson b/dbdata/config_events.bson
old mode 100644
new mode 100755
index a640292ed..75f6327ee
Binary files a/dbdata/config_events.bson and b/dbdata/config_events.bson differ
diff --git a/dbdata/config_events.metadata.json b/dbdata/config_events.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_field.bson b/dbdata/config_field.bson
old mode 100644
new mode 100755
index ba16133b2..aa8b10c4c
Binary files a/dbdata/config_field.bson and b/dbdata/config_field.bson differ
diff --git a/dbdata/config_field.metadata.json b/dbdata/config_field.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_priority.bson b/dbdata/config_priority.bson
old mode 100644
new mode 100755
diff --git a/dbdata/config_priority.metadata.json b/dbdata/config_priority.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_resolution.bson b/dbdata/config_resolution.bson
old mode 100644
new mode 100755
diff --git a/dbdata/config_resolution.metadata.json b/dbdata/config_resolution.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_screen.bson b/dbdata/config_screen.bson
old mode 100644
new mode 100755
index a60725329..b72a678cd
Binary files a/dbdata/config_screen.bson and b/dbdata/config_screen.bson differ
diff --git a/dbdata/config_screen.metadata.json b/dbdata/config_screen.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_state.bson b/dbdata/config_state.bson
old mode 100644
new mode 100755
diff --git a/dbdata/config_state.metadata.json b/dbdata/config_state.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/config_type.bson b/dbdata/config_type.bson
old mode 100644
new mode 100755
diff --git a/dbdata/config_type.metadata.json b/dbdata/config_type.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/labels.bson b/dbdata/labels.bson
old mode 100644
new mode 100755
diff --git a/dbdata/labels.metadata.json b/dbdata/labels.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/oswf_definition.bson b/dbdata/oswf_definition.bson
old mode 100644
new mode 100755
diff --git a/dbdata/oswf_definition.metadata.json b/dbdata/oswf_definition.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/oswf_entry.bson b/dbdata/oswf_entry.bson
old mode 100644
new mode 100755
diff --git a/dbdata/oswf_entry.metadata.json b/dbdata/oswf_entry.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/sys_setting.bson b/dbdata/sys_setting.bson
old mode 100644
new mode 100755
diff --git a/dbdata/sys_setting.metadata.json b/dbdata/sys_setting.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/system.indexes.bson b/dbdata/system.indexes.bson
old mode 100644
new mode 100755
diff --git a/dbdata/user_project.bson b/dbdata/user_project.bson
old mode 100644
new mode 100755
diff --git a/dbdata/user_project.metadata.json b/dbdata/user_project.metadata.json
old mode 100644
new mode 100755
diff --git a/dbdata/users.bson b/dbdata/users.bson
old mode 100644
new mode 100755
diff --git a/dbdata/users.metadata.json b/dbdata/users.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/Dockerfile b/docker/db/Dockerfile
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/acl_role.bson b/docker/db/dbdata/acl_role.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/acl_role.metadata.json b/docker/db/dbdata/acl_role.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/acl_role_permissions.bson b/docker/db/dbdata/acl_role_permissions.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/acl_role_permissions.metadata.json b/docker/db/dbdata/acl_role_permissions.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/activations.bson b/docker/db/dbdata/activations.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/activations.metadata.json b/docker/db/dbdata/activations.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_calendar_singular.bson b/docker/db/dbdata/config_calendar_singular.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_calendar_singular.metadata.json b/docker/db/dbdata/config_calendar_singular.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_event_notifications.bson b/docker/db/dbdata/config_event_notifications.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_event_notifications.metadata.json b/docker/db/dbdata/config_event_notifications.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_events.bson b/docker/db/dbdata/config_events.bson
old mode 100644
new mode 100755
index a640292ed..75f6327ee
Binary files a/docker/db/dbdata/config_events.bson and b/docker/db/dbdata/config_events.bson differ
diff --git a/docker/db/dbdata/config_events.metadata.json b/docker/db/dbdata/config_events.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_field.bson b/docker/db/dbdata/config_field.bson
old mode 100644
new mode 100755
index ba16133b2..aa8b10c4c
Binary files a/docker/db/dbdata/config_field.bson and b/docker/db/dbdata/config_field.bson differ
diff --git a/docker/db/dbdata/config_field.metadata.json b/docker/db/dbdata/config_field.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_priority.bson b/docker/db/dbdata/config_priority.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_priority.metadata.json b/docker/db/dbdata/config_priority.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_resolution.bson b/docker/db/dbdata/config_resolution.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_resolution.metadata.json b/docker/db/dbdata/config_resolution.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_screen.bson b/docker/db/dbdata/config_screen.bson
old mode 100644
new mode 100755
index a60725329..b72a678cd
Binary files a/docker/db/dbdata/config_screen.bson and b/docker/db/dbdata/config_screen.bson differ
diff --git a/docker/db/dbdata/config_screen.metadata.json b/docker/db/dbdata/config_screen.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_state.bson b/docker/db/dbdata/config_state.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_state.metadata.json b/docker/db/dbdata/config_state.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_type.bson b/docker/db/dbdata/config_type.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/config_type.metadata.json b/docker/db/dbdata/config_type.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/labels.bson b/docker/db/dbdata/labels.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/labels.metadata.json b/docker/db/dbdata/labels.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/oswf_definition.bson b/docker/db/dbdata/oswf_definition.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/oswf_definition.metadata.json b/docker/db/dbdata/oswf_definition.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/oswf_entry.bson b/docker/db/dbdata/oswf_entry.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/oswf_entry.metadata.json b/docker/db/dbdata/oswf_entry.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/sys_setting.bson b/docker/db/dbdata/sys_setting.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/sys_setting.metadata.json b/docker/db/dbdata/sys_setting.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/system.indexes.bson b/docker/db/dbdata/system.indexes.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/user_project.bson b/docker/db/dbdata/user_project.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/user_project.metadata.json b/docker/db/dbdata/user_project.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/users.bson b/docker/db/dbdata/users.bson
old mode 100644
new mode 100755
diff --git a/docker/db/dbdata/users.metadata.json b/docker/db/dbdata/users.metadata.json
old mode 100644
new mode 100755
diff --git a/docker/db/scripts/initdb.sh b/docker/db/scripts/initdb.sh
old mode 100644
new mode 100755
diff --git a/docker/db/scripts/run.sh b/docker/db/scripts/run.sh
old mode 100644
new mode 100755
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
old mode 100644
new mode 100755
diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile
old mode 100644
new mode 100755
diff --git a/docker/nginx/sites-enabled/actionview b/docker/nginx/sites-enabled/actionview
old mode 100644
new mode 100755
index ad5447b04..4c2d3efe2
--- a/docker/nginx/sites-enabled/actionview
+++ b/docker/nginx/sites-enabled/actionview
@@ -2,7 +2,7 @@ server {
listen 80;
- client_max_body_size 50m;
+ client_max_body_size 100m;
charset utf-8;
diff --git a/docker/web/Dockerfile b/docker/web/Dockerfile
old mode 100644
new mode 100755
index 63d12dbd7..f8aa81d44
--- a/docker/web/Dockerfile
+++ b/docker/web/Dockerfile
@@ -1,6 +1,6 @@
FROM ubuntu:16.04
-MAINTAINER lxerxa
"+i(p.message+"",!0)+"";throw p}}var d={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:s,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:s,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:s,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};d.bullet=/(?:[*+-]|\d+\.)/,d.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,d.item=l(d.item,"gm")(/bull/g,d.bullet)(),d.list=l(d.list)(/bull/g,d.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+d.def.source+")")(),d.blockquote=l(d.blockquote)("def",d.def)(),d._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",d.html=l(d.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/
1&&l.length>1||(e=i.slice(c+1).join("\n")+e,c=p-1)),r=o||/\n\n(?!\s*$)/.test(s),c!==p-1&&(o="\n"===s.charAt(s.length-1),r||(r=o)),this.tokens.push({type:r?"loose_item_start":"list_item_start"}),this.token(s,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),s={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},c=0;c "+e+" "+this.options.dictFallbackText+"
\n":"'+(n?e:i(e,!0))+"\n
"},o.prototype.blockquote=function(e){return""+(n?e:i(e,!0))+"\n\n"+e+"
\n"},o.prototype.html=function(e){return e},o.prototype.heading=function(e,t,n){return"
\n":"
\n"},o.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+""+n+">\n"},o.prototype.listitem=function(e){return"\n\n"+e+"\n\n"+t+"\n
\n"},o.prototype.tablerow=function(e){return"\n"+e+" \n"},o.prototype.tablecell=function(e,t){var n=t.header?"th":"td",o=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return o+e+""+n+">\n"},o.prototype.strong=function(e){return""+e+""},o.prototype.em=function(e){return""+e+""},o.prototype.codespan=function(e){return""+e+""},o.prototype.br=function(){return this.options.xhtml?"
":"
"},o.prototype.del=function(e){return""+e+""},o.prototype.link=function(e,t,n){if(this.options.sanitize){try{var o=decodeURIComponent(a(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(r){return""}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:"))return""}var i='"+n+""},o.prototype.image=function(e,t,n){var o='":">"},o.prototype.text=function(e){return e},r.parse=function(e,t,n){var o=new r(t,n);return o.parse(e)},r.prototype.parse=function(e){this.inline=new n(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,o,r,i="",a="";for(n="",e=0;e
'),o.push(a)}}),t=t.replace(/<\/div>(\s*?)
"),imgFiles:o}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void c.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var o=-1;0===n.indexOf("inlineimg-")&&(o=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:o}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,o=t.onEdit,r=t.fieldKey,i=t.value,a=void 0===i?"":i,l=this.state,u=l.inlinePreviewShow,c=l.photoIndex,d=this.extractImg(r,a),p=d.html,f=d.imgFiles;return s.default.createElement("div",{className:"issue-text-field"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){o&&o()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:p||'未设置'}}),u&&s.default.createElement(m.default,{mainSrc:f[c],nextSrc:f[(c+1)%f.length],prevSrc:f[(c+f.length-1)%f.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(c+f.length-1)%f.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(c+1)%f.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={MultiRowsTextEditor:y,MultiRowsTextReader:g}}).call(this)}finally{}},106:function(e,t,n){try{(function(){"use strict";function t(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n$');if(i.exec(t)){var a=RegExp.$1;if(!a)return;n=n.replace(t,'
'),r.push(a)}}),{html:n,imgFiles:r}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void d.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var o=-1;0===n.indexOf("inlineimg-")&&(o=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:o}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,o=t.onEdit,r=t.fieldKey,i=t.value,a=this.state,l=a.inlinePreviewShow,u=a.photoIndex,c=this.extractImg(r,i||""),d=c.html,p=c.imgFiles;return s.default.createElement("div",{className:"issue-text-field markdown-body"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){o&&o()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:d||'未设置'}}),l&&s.default.createElement(f.default,{mainSrc:p[u],nextSrc:p[(u+1)%p.length],prevSrc:p[(u+p.length-1)%p.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(u+p.length-1)%p.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(u+1)%p.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={RichTextEditor:g,RichTextReader:v}}).call(this)}finally{}},112:function(e,t,n){var o;!function(){"use strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),i={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen};o=function(){return i}.call(t,n,t,e),!(void 0!==o&&(e.exports=o))}()},115:function(e,t,n){function o(e){return e()}var r=n(1),i=n(13),a=n(71),l=n(25),s=n(112),u=r.createFactory(n(116)),c=n(117),d=n(119),p=n(207),f=n(13).unstable_renderSubtreeIntoContainer,m=n(70),h=n(69),y=s.canUseDOM?window.HTMLElement:{},g=s.canUseDOM?document.body:{appendChild:function(){}},v=h({displayName:"Modal",statics:{setAppElement:function(e){g=c.setElement(e)},injectCSS:function(){}},propTypes:{isOpen:l.bool.isRequired,style:l.shape({content:l.object,overlay:l.object}),portalClassName:l.string,bodyOpenClassName:l.string,appElement:l.instanceOf(y),onAfterOpen:l.func,onRequestClose:l.func,closeTimeoutMS:l.number,ariaHideApp:l.bool,shouldCloseOnOverlayClick:l.bool,parentSelector:l.func,role:l.string,contentLabel:l.string.isRequired},getDefaultProps:function(){return{isOpen:!1,portalClassName:"ReactModalPortal",bodyOpenClassName:"ReactModal__Body--open",ariaHideApp:!0,closeTimeoutMS:0,shouldCloseOnOverlayClick:!0,parentSelector:function(){return document.body}}},componentDidMount:function(){this.node=document.createElement("div"),this.node.className=this.props.portalClassName,this.props.isOpen&&d.add(this);var e=o(this.props.parentSelector);e.appendChild(this.node),this.renderPortal(this.props)},componentWillUpdate:function(e){e.portalClassName!==this.props.portalClassName&&(this.node.className=e.portalClassName)},componentWillReceiveProps:function(e){e.isOpen&&d.add(this),e.isOpen||d.remove(this);var t=o(this.props.parentSelector),n=o(e.parentSelector);n!==t&&(t.removeChild(this.node),n.appendChild(this.node)),this.renderPortal(e)},componentWillUnmount:function(){if(this.node){d.remove(this),this.props.ariaHideApp&&c.show(this.props.appElement);var e=this.portal.state,t=Date.now(),n=e.isOpen&&this.props.closeTimeoutMS&&(e.closesAt||t+this.props.closeTimeoutMS);if(n){e.beforeClose||this.portal.closeWithTimeout();var o=this;setTimeout(function(){o.removePortal()},n-t)}else this.removePortal()}},removePortal:function(){i.unmountComponentAtNode(this.node);var e=o(this.props.parentSelector);e.removeChild(this.node),0===d.count()&&p(document.body).remove(this.props.bodyOpenClassName)},renderPortal:function(e){e.isOpen||d.count()>0?p(document.body).add(this.props.bodyOpenClassName):p(document.body).remove(this.props.bodyOpenClassName),e.ariaHideApp&&c.toggle(e.isOpen,e.appElement),this.portal=f(this,u(m({},e,{defaultStyles:v.defaultStyles})),this.node)},render:function(){return a.noscript()}});v.defaultStyles={overlay:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(255, 255, 255, 0.75)"},content:{position:"absolute",top:"40px",left:"40px",right:"40px",bottom:"40px",border:"1px solid #ccc",background:"#fff",overflow:"auto",WebkitOverflowScrolling:"touch",borderRadius:"4px",outline:"none",padding:"20px"}},e.exports=v},116:function(e,t,n){var o=(n(1),n(71)),r=n(118),i=n(120),a=n(70),l=n(69),s=o.div,u={overlay:"ReactModal__Overlay",content:"ReactModal__Content"};e.exports=l({displayName:"ModalPortal",shouldClose:null,getDefaultProps:function(){return{style:{overlay:{},content:{}}}},getInitialState:function(){return{afterOpen:!1,beforeClose:!1}},componentDidMount:function(){this.props.isOpen&&(this.setFocusAfterRender(!0),this.open())},componentWillUnmount:function(){clearTimeout(this.closeTimer)},componentWillReceiveProps:function(e){!this.props.isOpen&&e.isOpen?(this.setFocusAfterRender(!0),this.open()):this.props.isOpen&&!e.isOpen&&this.close()},componentDidUpdate:function(){this.focusAfterRender&&(this.focusContent(),this.setFocusAfterRender(!1))},setFocusAfterRender:function(e){this.focusAfterRender=e},afterClose:function(){r.returnFocus(),r.teardownScopedFocus()},open:function(){this.state.afterOpen&&this.state.beforeClose?(clearTimeout(this.closeTimer),this.setState({beforeClose:!1})):(r.setupScopedFocus(this.node),r.markForFocusLater(),this.setState({isOpen:!0},function(){this.setState({afterOpen:!0}),this.props.isOpen&&this.props.onAfterOpen&&this.props.onAfterOpen()}.bind(this)))},close:function(){this.props.closeTimeoutMS>0?this.closeWithTimeout():this.closeWithoutTimeout()},focusContent:function(){this.contentHasFocus()||this.refs.content.focus()},closeWithTimeout:function(){var e=Date.now()+this.props.closeTimeoutMS;this.setState({beforeClose:!0,closesAt:e},function(){this.closeTimer=setTimeout(this.closeWithoutTimeout,this.state.closesAt-Date.now())}.bind(this))},closeWithoutTimeout:function(){this.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},this.afterClose)},handleKeyDown:function(e){9==e.keyCode&&i(this.refs.content,e),27==e.keyCode&&(e.preventDefault(),this.requestClose(e))},handleOverlayOnClick:function(e){null===this.shouldClose&&(this.shouldClose=!0),this.shouldClose&&this.props.shouldCloseOnOverlayClick&&(this.ownerHandlesClose()?this.requestClose(e):this.focusContent()),this.shouldClose=null},handleContentOnClick:function(){this.shouldClose=!1},requestClose:function(e){this.ownerHandlesClose()&&this.props.onRequestClose(e)},ownerHandlesClose:function(){return this.props.onRequestClose},shouldBeClosed:function(){return!this.state.isOpen&&!this.state.beforeClose},contentHasFocus:function(){return document.activeElement===this.refs.content||this.refs.content.contains(document.activeElement)},buildClassName:function(e,t){var n="object"==typeof t?t:{base:u[e],afterOpen:u[e]+"--after-open",beforeClose:u[e]+"--before-close"},o=n.base;return this.state.afterOpen&&(o+=" "+n.afterOpen),this.state.beforeClose&&(o+=" "+n.beforeClose),"string"==typeof t&&t?[o,t].join(" "):o},render:function(){var e=this.props.className?{}:this.props.defaultStyles.content,t=this.props.overlayClassName?{}:this.props.defaultStyles.overlay;return this.shouldBeClosed()?s():s({ref:"overlay",className:this.buildClassName("overlay",this.props.overlayClassName),style:a({},t,this.props.style.overlay||{}),onClick:this.handleOverlayOnClick},s({ref:"content",style:a({},e,this.props.style.content||{}),className:this.buildClassName("content",this.props.className),tabIndex:"-1",onKeyDown:this.handleKeyDown,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.props.children))}})},117:function(e,t){function n(e){if("string"==typeof e){var t=document.querySelectorAll(e);e="length"in t?t[0]:t}return s=e||s}function o(e){a(e),(e||s).setAttribute("aria-hidden","true")}function r(e){a(e),(e||s).removeAttribute("aria-hidden")}function i(e,t){e?o(t):r(t)}function a(e){if(!e&&!s)throw new Error("react-modal: You must set an element with `Modal.setAppElement(el)` to make this accessible")}function l(){s=document.body}var s="undefined"!=typeof document?document.body:null;t.toggle=i,t.setElement=n,t.show=r,t.hide=o,t.resetForTesting=l},118:function(e,t,n){function o(e){s=!0}function r(e){if(s){if(s=!1,!l)return;setTimeout(function(){if(!l.contains(document.activeElement)){var e=i(l)[0]||l;e.focus()}},0)}}var i=n(72),a=[],l=null,s=!1;t.markForFocusLater=function(){a.push(document.activeElement)},t.returnFocus=function(){var e=null;try{return e=a.pop(),void e.focus()}catch(t){}},t.setupScopedFocus=function(e){l=e,window.addEventListener?(window.addEventListener("blur",o,!1),document.addEventListener("focus",r,!0)):(window.attachEvent("onBlur",o),document.attachEvent("onFocus",r))},t.teardownScopedFocus=function(){l=null,window.addEventListener?(window.removeEventListener("blur",o),document.removeEventListener("focus",r)):(window.detachEvent("onBlur",o),document.detachEvent("onFocus",r))}},119:function(e,t){var n=[];e.exports={add:function(e){n.indexOf(e)===-1&&n.push(e)},remove:function(e){var t=n.indexOf(e);t!==-1&&n.splice(t,1)},count:function(){return n.length}}},120:function(e,t,n){var o=n(72);e.exports=function(e,t){var n=o(e);if(!n.length)return void t.preventDefault();var r=n[t.shiftKey?0:n.length-1],i=r===document.activeElement||e===document.activeElement;if(i){t.preventDefault();var a=n[t.shiftKey?n.length-1:0];a.focus()}}},121:function(e,t,n){e.exports=n(115)},127:function(e,t){e.exports=window.SimpleMDE},152:function(e,t,n){try{(function(){"use strict";function e(e){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_INDEX",promise:function(t){return t.request({url:"/project/"+e+"/workflow"})}})}function o(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_CREATE",promise:function(n){return n.request({url:"/project/"+e+"/workflow",method:"post",data:t})}})}function r(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_UPDATE",promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t.id,method:"put",data:t})}})}function i(e){return{type:"WORKFLOW_SELECT",id:e}}function a(e){return{type:"WORKFLOW_DELETE_NOTIFY",id:e}}function l(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_DELETE",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t,method:"delete"})}})}function s(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_PREVIEW",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t+"/preview"})}})}function u(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_VIEW_USED",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t+"/used"})}})}Object.defineProperty(t,"__esModule",{value:!0}),t.index=e,t.create=o,t.update=r,t.select=i,t.delNotify=a,t.del=l,t.preview=s,t.viewUsed=u;var c=n(26)}).call(this)}finally{}},178:function(e,t,n){try{(function(){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n
"),imgFileUrls:imgFileUrls}}},{key:"createLightbox",value:function(e,t,n){var o=this;return _react2.default.createElement(_reactImageLightbox2.default,{mainSrc:t[n],nextSrc:t[(n+1)%t.length],prevSrc:t[(n+t.length-1)%t.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){o.state.inlinePreviewShow[e]=!1,o.setState({inlinePreviewShow:o.state.inlinePreviewShow})},onMovePrevRequest:function(){return o.setState({photoIndex:(n+t.length-1)%t.length})},onMoveNextRequest:function(){return o.setState({photoIndex:(n+1)%t.length})}})}},{key:"previewInlineImg",value:function(e){var t=e.target.id;if(t){var n="",o=-1;0===t.indexOf("inlineimg-")&&(n=t.substring(10,t.lastIndexOf("-")),o=t.substr(t.lastIndexOf("-")+1)-0),this.state.inlinePreviewShow[n]=!0,this.setState({inlinePreviewShow:this.state.inlinePreviewShow,photoIndex:o})}}},{key:"componentDidUpdate",value:function(){var e=this.props.users;_lodash2.default.map(e||[],function(e){return e.nameAndEmail=e.name+"("+e.email+")",e});var t=this;$(".comments-inputor textarea").atwho({at:"@",searchKey:"nameAndEmail",displayTpl:"
"):e.before_value}})),u.default.createElement("td",{width:"38%"},u.default.createElement("div",{style:{whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:f.default.isString(e.after_value)?f.default.escape(e.after_value).replace(/(\r\n)|(\n)/g,"
"):e.after_value}})))}))):u.default.createElement("span",{style:{marginLeft:"5px"}},"创建问题"))}))))}}],[{key:"propTypes",value:{issue_id:s.PropTypes.string,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,indexLoading:s.PropTypes.bool.isRequired,indexHistory:s.PropTypes.func.isRequired,sortHistory:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=g,e.exports=t.default}).call(this)}finally{}},229:function(e,t,n){try{(function(){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n
"),u.default.createElement(d.Panel,{header:a,key:n,style:{marginBottom:"15px"}},u.default.createElement(d.Table,{condensed:!0,hover:!0,responsive:!0},u.default.createElement("thead",null,u.default.createElement("tr",null,u.default.createElement("th",null,"开始日期"),u.default.createElement("th",null,"耗费时间"),u.default.createElement("th",null,"剩余时间"))),u.default.createElement("tbody",null,u.default.createElement("tr",null,u.default.createElement("td",null,y.unix(t.started_at).format("YYYY/MM/DD HH:mm:ss")),u.default.createElement("td",null,t.spend||"-"),u.default.createElement("td",null,void 0===t.leave_estimate_m?"-":e.m2t(t.leave_estimate_m))))),u.default.createElement("div",{style:{marginLeft:"5px",lineHeight:"24px"}},u.default.createElement("span",{style:{width:"10%","float":"left",fontWeight:"bold"}},"备注:"),u.default.createElement("span",{style:{width:"90%","float":"left",whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:l}})))}))),this.state.addWorklogShow&&u.default.createElement(g,{show:!0,issue:a,close:function(){e.setState({addWorklogShow:!1})},data:this.state.selectedWorklog,loading:_,add:w,edit:k,i18n:n}),this.state.delWorklogShow&&u.default.createElement(v,{show:!0,issue:a,close:function(){e.setState({delWorklogShow:!1})},data:this.state.selectedWorklog,loading:_,del:E,i18n:n}))}}],[{key:"propTypes",value:{i18n:s.PropTypes.object.isRequired,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,permissions:s.PropTypes.array.isRequired,issue:s.PropTypes.object.isRequired,options:s.PropTypes.object.isRequired,original_estimate:s.PropTypes.string,indexLoading:s.PropTypes.bool.isRequired,loading:s.PropTypes.bool.isRequired,indexWorklog:s.PropTypes.func.isRequired,sort:s.PropTypes.string.isRequired,sortWorklog:s.PropTypes.func.isRequired,addWorklog:s.PropTypes.func.isRequired,editWorklog:s.PropTypes.func.isRequired,delWorklog:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=b,e.exports=t.default}).call(this)}finally{}},1796:function(e,t,n){try{(function(){"use strict";function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e){return{actions:(0,m.bindActionCreators)(y,e),issueActions:(0,m.bindActionCreators)(_,e),wfActions:(0,m.bindActionCreators)(k,e)}}Object.defineProperty(t,"__esModule",{value:!0});var s=Object.assign||function(e){for(var t=1;t
")),activities.push({id:collection[i].id,avatar:_react2.default.createElement("img",{src:collection[i].user.avatar?API_BASENAME+"/getavatar?fid="+collection[i].user.avatar:no_avatar,className:"default-avatar"}),summary:_react2.default.createElement("div",null,_react2.default.createElement("span",{style:{marginRight:"5px"}},_react2.default.createElement("b",null,user.id===collection[i].user.id?"我":collection[i].user.name)),"create_link"==collection[i].event_key&&_react2.default.createElement("span",null,"创建了问题链接"),"del_link"==collection[i].event_key&&_react2.default.createElement("span",null,"删除了问题链接"),collection[i].issue_link&&_react2.default.createElement("ul",{className:"list-unstyled clearfix",style:{marginTop:"10px",marginBottom:"5px",fontSize:"12px"}},_react2.default.createElement("li",null,collection[i].issue_link&&collection[i].issue_link.src&&(1===collection[i].issue_link.src.del_flg?_react2.default.createElement("span",{style:ltStyles},collection[i].issue_link.src.no+" - "+collection[i].issue_link.src.title):_react2.default.createElement("a",{style:"Closed"==collection[i].issue_link.src.state?{textDecoration:"line-through"}:{},href:"#",onClick:function(e){e.preventDefault(),e.stopPropagation(),_this2.issueView(collection[i].issue_link.src.id)}},_react2.default.createElement("span",{style:{marginRight:"5px"}},collection[i].issue_link.src.no+" - "+collection[i].issue_link.src.title)))),_react2.default.createElement("li",null,collection[i].issue_link&&collection[i].issue_link.relation||""),_react2.default.createElement("li",null,collection[i].issue_link&&collection[i].issue_link.dest&&(1===collection[i].issue_link.dest.del_flg?_react2.default.createElement("span",{style:ltStyles},collection[i].issue_link.dest.no+" - "+collection[i].issue_link.dest.title):_react2.default.createElement("a",{style:"Closed"==collection[i].issue_link.dest.state?{textDecoration:"line-through"}:{},href:"#",onClick:function(e){e.preventDefault(),e.stopPropagation(),_this2.issueView(collection[i].issue_link.dest.id)}},_react2.default.createElement("span",{style:{marginRight:"5px"}},collection[i].issue_link.dest.no+" - "+collection[i].issue_link.dest.title))))),"create_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"创建了"),"edit_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"更新了"),"del_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"删除了"),"assign_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"分配了"),"reset_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"重置了"),"move_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"移动了"),"start_progress_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"开始解决"),"stop_progress_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"停止解决"),"resolve_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"解决了"),"close_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"关闭了"),"reopen_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"重新打开"),"watched_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"关注了"),"unwatched_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"取消关注了"),collection[i].event_key.indexOf("_")===-1&&_react2.default.createElement("span",null,"将"),collection[i].issue&&_react2.default.createElement("span",{style:{marginRight:"5px"}},"问题"),collection[i].issue&&(1===collection[i].issue.del_flg?_react2.default.createElement("span",{style:ltStyles},collection[i].issue.no+" - "+collection[i].issue.title):_react2.default.createElement("a",{href:"#",style:"Closed"==collection[i].issue.state?{textDecoration:"line-through"}:{},onClick:function(e){e.preventDefault(),e.stopPropagation(),_this2.issueView(collection[i].issue.id)}},_react2.default.createElement("span",{style:{marginRight:"5px",whiteSpace:"pre-wrap",wordWrap:"break-word"}},collection[i].issue.no+" - "+collection[i].issue.title))),wfEventFlag&&collection[i].event_key.indexOf("_")!==-1&&_react2.default.createElement("span",null,", "),wfEventFlag&&collection[i].event_key.indexOf("_")===-1&&_react2.default.createElement("span",null,"的"),wfEventFlag&&_react2.default.createElement("span",null,_lodash2.default.map(collection[i].data,function(e,t){return 0===t?_react2.default.createElement("span",null,e.field+" 更新为: "+e.after_value):_react2.default.createElement("span",null,", "+e.field+" 更新为: "+e.after_value)})),"edit_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"的 ",collection[i].data.length," 个字段"),"edit_issue"==collection[i].event_key&&_react2.default.createElement("ul",{className:"list-unstyled clearfix",style:{marginTop:"10px",marginBottom:"5px",fontSize:"12px"}},_lodash2.default.map(collection[i].data,function(e,t){return _react2.default.createElement("li",{style:{whiteSpace:"pre-wrap",wordWrap:"break-word"},key:t,dangerouslySetInnerHTML:{__html:e.field+": "+(_lodash2.default.isString(e.after_value)?_lodash2.default.escape(e.after_value).replace(/(\r\n)|(\n)/g,"
"):e.after_value)}})})),"assign_issue"==collection[i].event_key&&_react2.default.createElement("span",null,"给 ",collection[i].data.new_user&&user.id===collection[i].data.new_user.id?"我":collection[i].data.new_user.name||""),"add_file"==collection[i].event_key&&_react2.default.createElement("span",null,"上传了文档 ",collection[i].data),"del_file"==collection[i].event_key&&_react2.default.createElement("span",null,"删除了文档 ",_react2.default.createElement("span",{style:ltStyles},collection[i].data)),"add_comments"==collection[i].event_key&&_react2.default.createElement("span",null,"添加了评论"),"edit_comments"==collection[i].event_key&&_react2.default.createElement("span",null,"编辑了评论"),"del_comments"==collection[i].event_key&&_react2.default.createElement("span",null,"删除了评论"),comments&&_react2.default.createElement("ul",{className:"list-unstyled clearfix",style:{marginTop:"10px",marginBottom:"5px",fontSize:"12px"}},_react2.default.createElement("li",{style:"del_comments"==collection[i].event_key?ltStyles:{whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:comments}})),"add_worklog"==collection[i].event_key&&_react2.default.createElement("span",null," 添加了工作日志"),"edit_worklog"==collection[i].event_key&&_react2.default.createElement("span",null," 编辑了工作日志"),"del_worklog"==collection[i].event_key&&_react2.default.createElement("span",null," 删除了工作日志"),collection[i].event_key.indexOf("worklog")!==-1&&_react2.default.createElement("ul",{className:"list-unstyled clearfix",style:{marginTop:"10px",marginBottom:"5px",fontSize:"12px"}},collection[i].data&&collection[i].data.started_at&&_react2.default.createElement("li",{style:"del_worklog"==collection[i].event_key?ltStyles:{}},"开始时间: ",moment.unix(collection[i].data.started_at).format("YYYY/MM/DD")),collection[i].data&&collection[i].data.spend&&_react2.default.createElement("li",{style:"del_worklog"==collection[i].event_key?ltStyles:{}},"耗时: ",collection[i].data.spend),collection[i].data&&collection[i].data.leave_estimate&&_react2.default.createElement("li",{style:"del_worklog"==collection[i].event_key?ltStyles:{}},"剩余时间设置为: ",collection[i].data.leave_estimate),collection[i].data&&collection[i].data.cut&&_react2.default.createElement("li",{style:"del_worklog"==collection[i].event_key?ltStyles:{}},"剩余时间缩减: ",collection[i].data.cut),collection[i].data&&collection[i].data.comments&&_react2.default.createElement("li",{style:"del_worklog"==collection[i].event_key?ltStyles:{whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:"评论 : "+_lodash2.default.escape(collection[i].data.comments).replace(/(\r\n)|(\n)/g,"
")}}))),time:agoAt})},i=0;i0;){if(a=H(s.slice(0,t).join("-")))return a;if(n&&n.length>=t&&Y(s,n,!0)>=t-1)break;t--}r++}return null}function H(t){var a=null;if(!fa[t]&&"undefined"!=typeof e&&e&&e.exports)try{a=ha._abbr,n(171)("./"+t),x(a)}catch(s){}return fa[t]}function x(e,t){var n;return e&&(n=h(t)?O(e):F(e,t),n&&(ha=n)),ha._abbr}function F(e,t){return null!==t?(t.abbr=e,null!=fa[e]?(k("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),t=b(fa[e]._config,t)):null!=t.parentLocale&&(null!=fa[t.parentLocale]?t=b(fa[t.parentLocale]._config,t):k("parentLocaleUndefined","specified parentLocale is not defined yet")),fa[e]=new S(t),x(e),fa[e]):(delete fa[e],null)}function P(e,t){if(null!=t){var n;null!=fa[e]&&(t=b(fa[e]._config,t)),n=new S(t),n.parentLocale=fa[e],fa[e]=n,x(e)}else null!=fa[e]&&(null!=fa[e].parentLocale?fa[e]=fa[e].parentLocale:null!=fa[e]&&delete fa[e]);return fa[e]}function O(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return ha;if(!s(e)){if(t=H(e))return t;e=[e]}return j(e)}function A(){return ma(fa)}function C(e,t){var n=e.toLowerCase();Ma[n]=Ma[n+"s"]=Ma[t]=e}function W(e){return"string"==typeof e?Ma[e]||Ma[e.toLowerCase()]:void 0}function N(e){var t,n,a={};for(n in e)o(e,n)&&(t=W(n),t&&(a[t]=e[n]));return a}function R(e,n){return function(a){return null!=a?(I(this,e,a),t.updateOffset(this,n),this):z(this,e)}}function z(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function I(e,t,n){e.isValid()&&e._d["set"+(e._isUTC?"UTC":"")+t](n)}function V(e,t){var n;if("object"==typeof e)for(n in e)this.set(n,e[n]);else if(e=W(e),v(this[e]))return this[e](t);return this}function J(e,t,n){var a=""+Math.abs(e),s=t-a.length,r=e>=0;return(r?n?"+":"":"-")+Math.pow(10,Math.max(0,s)).toString().substr(1)+a}function B(e,t,n,a){var s=a;"string"==typeof a&&(s=function(){return this[a]()}),e&&(Da[e]=s),t&&(Da[t[0]]=function(){return J(s.apply(this,arguments),t[1],t[2])}),n&&(Da[n]=function(){return this.localeData().ordinal(s.apply(this,arguments),e)})}function U(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function G(e){var t,n,a=e.match(ya);for(t=0,n=a.length;t0;){if(a=x(s.slice(0,t).join("-")))return a;if(n&&n.length>=t&&g(s,n,!0)>=t-1)break;t--}r++}return null}function x(t){var a=null;if(!fa[t]&&"undefined"!=typeof e&&e&&e.exports)try{a=ha._abbr,n(171)("./"+t),F(a)}catch(s){}return fa[t]}function F(e,t){var n;return e&&(n=h(t)?O(e):H(e,t),n&&(ha=n)),ha._abbr}function H(e,t){return null!==t?(t.abbr=e,null!=fa[e]?(D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),t=T(fa[e]._config,t)):null!=t.parentLocale&&(null!=fa[t.parentLocale]?t=T(fa[t.parentLocale]._config,t):D("parentLocaleUndefined","specified parentLocale is not defined yet")),fa[e]=new E(t),F(e),fa[e]):(delete fa[e],null)}function P(e,t){if(null!=t){var n;null!=fa[e]&&(t=T(fa[e]._config,t)),n=new E(t),n.parentLocale=fa[e],fa[e]=n,F(e)}else null!=fa[e]&&(null!=fa[e].parentLocale?fa[e]=fa[e].parentLocale:null!=fa[e]&&delete fa[e]);return fa[e]}function O(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return ha;if(!s(e)){if(t=x(e))return t;e=[e]}return j(e)}function C(){return ma(fa)}function A(e,t){var n=e.toLowerCase();ya[n]=ya[n+"s"]=ya[t]=e}function W(e){return"string"==typeof e?ya[e]||ya[e.toLowerCase()]:void 0}function R(e){var t,n,a={};for(n in e)o(e,n)&&(t=W(n),t&&(a[t]=e[n]));return a}function z(e,n){return function(a){return null!=a?(I(this,e,a),t.updateOffset(this,n),this):N(this,e)}}function N(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function I(e,t,n){e.isValid()&&e._d["set"+(e._isUTC?"UTC":"")+t](n)}function V(e,t){var n;if("object"==typeof e)for(n in e)this.set(n,e[n]);else if(e=W(e),k(this[e]))return this[e](t);return this}function U(e,t,n){var a=""+Math.abs(e),s=t-a.length,r=e>=0;return(r?n?"+":"":"-")+Math.pow(10,Math.max(0,s)).toString().substr(1)+a}function B(e,t,n,a){var s=a;"string"==typeof a&&(s=function(){return this[a]()}),e&&(va[e]=s),t&&(va[t[0]]=function(){return U(s.apply(this,arguments),t[1],t[2])}),n&&(va[n]=function(){return this.localeData().ordinal(s.apply(this,arguments),e)})}function q(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function J(e){var t,n,a=e.match(Ma);for(t=0,n=a.length;t
"+a(p.message+"",!0)+"";throw p}}var d={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:s,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:s,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:s,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};d.bullet=/(?:[*+-]|\d+\.)/,d.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,d.item=l(d.item,"gm")(/bull/g,d.bullet)(),d.list=l(d.list)(/bull/g,d.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+d.def.source+")")(),d.blockquote=l(d.blockquote)("def",d.def)(),d._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",d.html=l(d.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/
1&&l.length>1||(e=a.slice(c+1).join("\n")+e,c=p-1)),i=r||/\n\n(?!\s*$)/.test(s),c!==p-1&&(r="\n"===s.charAt(s.length-1),i||(i=r)),this.tokens.push({type:i?"loose_item_start":"list_item_start"}),this.token(s,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(a=this.rules.html.exec(e))e=e.substring(a[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===a[1]||"script"===a[1]||"style"===a[1]),text:a[0]});else if(!n&&t&&(a=this.rules.def.exec(e)))e=e.substring(a[0].length),this.tokens.links[a[1].toLowerCase()]={href:a[2],title:a[3]};else if(t&&(a=this.rules.table.exec(e))){for(e=e.substring(a[0].length),s={type:"table",header:a[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:a[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:a[3].replace(/(?: *\| *)?\n$/,"").split("\n")},c=0;c "+e+" "+this.options.dictFallbackText+" "+this.options.dictFallbackText+"
\n":"'+(n?e:a(e,!0))+"\n
"},r.prototype.blockquote=function(e){return""+(n?e:a(e,!0))+"\n\n"+e+"
\n"},r.prototype.html=function(e){return e},r.prototype.heading=function(e,t,n){return"
\n":"
\n"},r.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+""+n+">\n"},r.prototype.listitem=function(e){return"\n\n"+e+"\n\n"+t+"\n
\n"},r.prototype.tablerow=function(e){return"\n"+e+" \n"},r.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+""+n+">\n"},r.prototype.strong=function(e){return""+e+""},r.prototype.em=function(e){return""+e+""},r.prototype.codespan=function(e){return""+e+""},r.prototype.br=function(){return this.options.xhtml?"
":"
"},r.prototype.del=function(e){return""+e+""},r.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(o(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(i){return""}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:"))return""}var a='"+n+""},r.prototype.image=function(e,t,n){var r='":">"},r.prototype.text=function(e){return e},i.parse=function(e,t,n){var r=new i(t,n);return r.parse(e)},i.prototype.parse=function(e){this.inline=new n(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},i.prototype.next=function(){return this.token=this.tokens.pop()},i.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},i.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},i.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,i,a="",o="";for(n="",e=0;e
'),r.push(o)}}),t=t.replace(/<\/div>(\s*?)
"),imgFiles:r}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void c.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var r=-1;0===n.indexOf("inlineimg-")&&(r=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:r}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,r=t.onEdit,i=t.fieldKey,a=t.value,o=void 0===a?"":a,l=this.state,u=l.inlinePreviewShow,c=l.photoIndex,d=this.extractImg(i,o),p=d.html,f=d.imgFiles;return s.default.createElement("div",{className:"issue-text-field"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){r&&r()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:p||'未设置'}}),u&&s.default.createElement(m.default,{mainSrc:f[c],nextSrc:f[(c+1)%f.length],prevSrc:f[(c+f.length-1)%f.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(c+f.length-1)%f.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(c+1)%f.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={MultiRowsTextEditor:y,MultiRowsTextReader:g}}).call(this)}finally{}},106:function(e,t,n){try{(function(){"use strict";function t(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=function(){function e(e,t){for(var n=0;n$');if(a.exec(t)){var o=RegExp.$1;if(!o)return;n=n.replace(t,'
'),i.push(o)}}),{html:n,imgFiles:i}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void d.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var r=-1;0===n.indexOf("inlineimg-")&&(r=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:r}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,r=t.onEdit,i=t.fieldKey,a=t.value,o=this.state,l=o.inlinePreviewShow,u=o.photoIndex,c=this.extractImg(i,a||""),d=c.html,p=c.imgFiles;return s.default.createElement("div",{className:"issue-text-field markdown-body"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){r&&r()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:d||'未设置'}}),l&&s.default.createElement(f.default,{mainSrc:p[u],nextSrc:p[(u+1)%p.length],prevSrc:p[(u+p.length-1)%p.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(u+p.length-1)%p.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(u+1)%p.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={RichTextEditor:g,RichTextReader:v}}).call(this)}finally{}},112:function(e,t,n){var r;!function(){"use strict";var i=!("undefined"==typeof window||!window.document||!window.document.createElement),a={canUseDOM:i,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:i&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:i&&!!window.screen};r=function(){return a}.call(t,n,t,e),!(void 0!==r&&(e.exports=r))}()},115:function(e,t,n){function r(e){return e()}var i=n(1),a=n(13),o=n(71),l=n(25),s=n(112),u=i.createFactory(n(116)),c=n(117),d=n(119),p=n(207),f=n(13).unstable_renderSubtreeIntoContainer,m=n(70),h=n(69),y=s.canUseDOM?window.HTMLElement:{},g=s.canUseDOM?document.body:{appendChild:function(){}},v=h({displayName:"Modal",statics:{setAppElement:function(e){g=c.setElement(e)},injectCSS:function(){}},propTypes:{isOpen:l.bool.isRequired,style:l.shape({content:l.object,overlay:l.object}),portalClassName:l.string,bodyOpenClassName:l.string,appElement:l.instanceOf(y),onAfterOpen:l.func,onRequestClose:l.func,closeTimeoutMS:l.number,ariaHideApp:l.bool,shouldCloseOnOverlayClick:l.bool,parentSelector:l.func,role:l.string,contentLabel:l.string.isRequired},getDefaultProps:function(){return{isOpen:!1,portalClassName:"ReactModalPortal",bodyOpenClassName:"ReactModal__Body--open",ariaHideApp:!0,closeTimeoutMS:0,shouldCloseOnOverlayClick:!0,parentSelector:function(){return document.body}}},componentDidMount:function(){this.node=document.createElement("div"),this.node.className=this.props.portalClassName,this.props.isOpen&&d.add(this);var e=r(this.props.parentSelector);e.appendChild(this.node),this.renderPortal(this.props)},componentWillUpdate:function(e){e.portalClassName!==this.props.portalClassName&&(this.node.className=e.portalClassName)},componentWillReceiveProps:function(e){e.isOpen&&d.add(this),e.isOpen||d.remove(this);var t=r(this.props.parentSelector),n=r(e.parentSelector);n!==t&&(t.removeChild(this.node),n.appendChild(this.node)),this.renderPortal(e)},componentWillUnmount:function(){if(this.node){d.remove(this),this.props.ariaHideApp&&c.show(this.props.appElement);var e=this.portal.state,t=Date.now(),n=e.isOpen&&this.props.closeTimeoutMS&&(e.closesAt||t+this.props.closeTimeoutMS);if(n){e.beforeClose||this.portal.closeWithTimeout();var r=this;setTimeout(function(){r.removePortal()},n-t)}else this.removePortal()}},removePortal:function(){a.unmountComponentAtNode(this.node);var e=r(this.props.parentSelector);e.removeChild(this.node),0===d.count()&&p(document.body).remove(this.props.bodyOpenClassName)},renderPortal:function(e){e.isOpen||d.count()>0?p(document.body).add(this.props.bodyOpenClassName):p(document.body).remove(this.props.bodyOpenClassName),e.ariaHideApp&&c.toggle(e.isOpen,e.appElement),this.portal=f(this,u(m({},e,{defaultStyles:v.defaultStyles})),this.node)},render:function(){return o.noscript()}});v.defaultStyles={overlay:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(255, 255, 255, 0.75)"},content:{position:"absolute",top:"40px",left:"40px",right:"40px",bottom:"40px",border:"1px solid #ccc",background:"#fff",overflow:"auto",WebkitOverflowScrolling:"touch",borderRadius:"4px",outline:"none",padding:"20px"}},e.exports=v},116:function(e,t,n){var r=(n(1),n(71)),i=n(118),a=n(120),o=n(70),l=n(69),s=r.div,u={overlay:"ReactModal__Overlay",content:"ReactModal__Content"};e.exports=l({displayName:"ModalPortal",shouldClose:null,getDefaultProps:function(){return{style:{overlay:{},content:{}}}},getInitialState:function(){return{afterOpen:!1,beforeClose:!1}},componentDidMount:function(){this.props.isOpen&&(this.setFocusAfterRender(!0),this.open())},componentWillUnmount:function(){clearTimeout(this.closeTimer)},componentWillReceiveProps:function(e){!this.props.isOpen&&e.isOpen?(this.setFocusAfterRender(!0),this.open()):this.props.isOpen&&!e.isOpen&&this.close()},componentDidUpdate:function(){this.focusAfterRender&&(this.focusContent(),this.setFocusAfterRender(!1))},setFocusAfterRender:function(e){this.focusAfterRender=e},afterClose:function(){i.returnFocus(),i.teardownScopedFocus()},open:function(){this.state.afterOpen&&this.state.beforeClose?(clearTimeout(this.closeTimer),this.setState({beforeClose:!1})):(i.setupScopedFocus(this.node),i.markForFocusLater(),this.setState({isOpen:!0},function(){this.setState({afterOpen:!0}),this.props.isOpen&&this.props.onAfterOpen&&this.props.onAfterOpen()}.bind(this)))},close:function(){this.props.closeTimeoutMS>0?this.closeWithTimeout():this.closeWithoutTimeout()},focusContent:function(){this.contentHasFocus()||this.refs.content.focus()},closeWithTimeout:function(){var e=Date.now()+this.props.closeTimeoutMS;this.setState({beforeClose:!0,closesAt:e},function(){this.closeTimer=setTimeout(this.closeWithoutTimeout,this.state.closesAt-Date.now())}.bind(this))},closeWithoutTimeout:function(){this.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},this.afterClose)},handleKeyDown:function(e){9==e.keyCode&&a(this.refs.content,e),27==e.keyCode&&(e.preventDefault(),this.requestClose(e))},handleOverlayOnClick:function(e){null===this.shouldClose&&(this.shouldClose=!0),this.shouldClose&&this.props.shouldCloseOnOverlayClick&&(this.ownerHandlesClose()?this.requestClose(e):this.focusContent()),this.shouldClose=null},handleContentOnClick:function(){this.shouldClose=!1},requestClose:function(e){this.ownerHandlesClose()&&this.props.onRequestClose(e)},ownerHandlesClose:function(){return this.props.onRequestClose},shouldBeClosed:function(){return!this.state.isOpen&&!this.state.beforeClose},contentHasFocus:function(){return document.activeElement===this.refs.content||this.refs.content.contains(document.activeElement)},buildClassName:function(e,t){var n="object"==typeof t?t:{base:u[e],afterOpen:u[e]+"--after-open",beforeClose:u[e]+"--before-close"},r=n.base;return this.state.afterOpen&&(r+=" "+n.afterOpen),this.state.beforeClose&&(r+=" "+n.beforeClose),"string"==typeof t&&t?[r,t].join(" "):r},render:function(){var e=this.props.className?{}:this.props.defaultStyles.content,t=this.props.overlayClassName?{}:this.props.defaultStyles.overlay;return this.shouldBeClosed()?s():s({ref:"overlay",className:this.buildClassName("overlay",this.props.overlayClassName),style:o({},t,this.props.style.overlay||{}),onClick:this.handleOverlayOnClick},s({ref:"content",style:o({},e,this.props.style.content||{}),className:this.buildClassName("content",this.props.className),tabIndex:"-1",onKeyDown:this.handleKeyDown,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.props.children))}})},117:function(e,t){function n(e){if("string"==typeof e){var t=document.querySelectorAll(e);e="length"in t?t[0]:t}return s=e||s}function r(e){o(e),(e||s).setAttribute("aria-hidden","true")}function i(e){o(e),(e||s).removeAttribute("aria-hidden")}function a(e,t){e?r(t):i(t)}function o(e){if(!e&&!s)throw new Error("react-modal: You must set an element with `Modal.setAppElement(el)` to make this accessible")}function l(){s=document.body}var s="undefined"!=typeof document?document.body:null;t.toggle=a,t.setElement=n,t.show=i,t.hide=r,t.resetForTesting=l},118:function(e,t,n){function r(e){s=!0}function i(e){if(s){if(s=!1,!l)return;setTimeout(function(){if(!l.contains(document.activeElement)){var e=a(l)[0]||l;e.focus()}},0)}}var a=n(72),o=[],l=null,s=!1;t.markForFocusLater=function(){o.push(document.activeElement)},t.returnFocus=function(){var e=null;try{return e=o.pop(),void e.focus()}catch(t){}},t.setupScopedFocus=function(e){l=e,window.addEventListener?(window.addEventListener("blur",r,!1),document.addEventListener("focus",i,!0)):(window.attachEvent("onBlur",r),document.attachEvent("onFocus",i))},t.teardownScopedFocus=function(){l=null,window.addEventListener?(window.removeEventListener("blur",r),document.removeEventListener("focus",i)):(window.detachEvent("onBlur",r),document.detachEvent("onFocus",i))}},119:function(e,t){var n=[];e.exports={add:function(e){n.indexOf(e)===-1&&n.push(e)},remove:function(e){var t=n.indexOf(e);t!==-1&&n.splice(t,1)},count:function(){return n.length}}},120:function(e,t,n){var r=n(72);e.exports=function(e,t){var n=r(e);if(!n.length)return void t.preventDefault();var i=n[t.shiftKey?0:n.length-1],a=i===document.activeElement||e===document.activeElement;if(a){t.preventDefault();var o=n[t.shiftKey?n.length-1:0];o.focus()}}},121:function(e,t,n){e.exports=n(115)},127:function(e,t){e.exports=window.SimpleMDE},152:function(e,t,n){try{(function(){"use strict";function e(e){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_INDEX",promise:function(t){return t.request({url:"/project/"+e+"/workflow"})}})}function r(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_CREATE",promise:function(n){return n.request({url:"/project/"+e+"/workflow",method:"post",data:t})}})}function i(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_UPDATE",promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t.id,method:"put",data:t})}})}function a(e){return{type:"WORKFLOW_SELECT",id:e}}function o(e){return{type:"WORKFLOW_DELETE_NOTIFY",id:e}}function l(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_DELETE",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t,method:"delete"})}})}function s(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_PREVIEW",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t+"/preview"})}})}function u(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_VIEW_USED",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t+"/used"})}})}Object.defineProperty(t,"__esModule",{value:!0}),t.index=e,t.create=r,t.update=i,t.select=a,t.delNotify=o,t.del=l,t.preview=s,t.viewUsed=u;var c=n(26)}).call(this)}finally{}},178:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n
"),imgFileUrls:imgFileUrls}}},{key:"createLightbox",value:function(e,t,n){var r=this;return _react2.default.createElement(_reactImageLightbox2.default,{mainSrc:t[n],nextSrc:t[(n+1)%t.length],prevSrc:t[(n+t.length-1)%t.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){r.state.inlinePreviewShow[e]=!1,r.setState({inlinePreviewShow:r.state.inlinePreviewShow})},onMovePrevRequest:function(){return r.setState({photoIndex:(n+t.length-1)%t.length})},onMoveNextRequest:function(){return r.setState({photoIndex:(n+1)%t.length})}})}},{key:"previewInlineImg",value:function(e){var t=e.target.id;if(t){var n="",r=-1;0===t.indexOf("inlineimg-")&&(n=t.substring(10,t.lastIndexOf("-")),r=t.substr(t.lastIndexOf("-")+1)-0),this.state.inlinePreviewShow[n]=!0,this.setState({inlinePreviewShow:this.state.inlinePreviewShow,photoIndex:r})}}},{key:"componentDidUpdate",value:function(){var e=this.props.users;_lodash2.default.map(e||[],function(e){return e.nameAndEmail=e.name+"("+e.email+")",e});var t=this;$(".comments-inputor textarea").atwho({at:"@",searchKey:"nameAndEmail",displayTpl:"
"):e.before_value}})),u.default.createElement("td",{width:"38%"},u.default.createElement("div",{style:{whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:f.default.isString(e.after_value)?f.default.escape(e.after_value).replace(/(\r\n)|(\n)/g,"
"):e.after_value}})))}))):u.default.createElement("span",{style:{marginLeft:"5px"}},"创建问题"))}))))}}],[{key:"propTypes",value:{issue_id:s.PropTypes.string,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,indexLoading:s.PropTypes.bool.isRequired,indexHistory:s.PropTypes.func.isRequired,sortHistory:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=g,e.exports=t.default}).call(this)}finally{}},229:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n
"),u.default.createElement(d.Panel,{header:o,key:n,style:{marginBottom:"15px"}},u.default.createElement(d.Table,{condensed:!0,hover:!0,responsive:!0},u.default.createElement("thead",null,u.default.createElement("tr",null,u.default.createElement("th",null,"开始日期"),u.default.createElement("th",null,"耗费时间"),u.default.createElement("th",null,"剩余时间"))),u.default.createElement("tbody",null,u.default.createElement("tr",null,u.default.createElement("td",null,y.unix(t.started_at).format("YYYY/MM/DD HH:mm:ss")),u.default.createElement("td",null,t.spend||"-"),u.default.createElement("td",null,void 0===t.leave_estimate_m?"-":e.m2t(t.leave_estimate_m))))),u.default.createElement("div",{style:{marginLeft:"5px",lineHeight:"24px"}},u.default.createElement("span",{style:{width:"10%","float":"left",fontWeight:"bold"}},"备注:"),u.default.createElement("span",{style:{width:"90%","float":"left",whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:l}})))}))),this.state.addWorklogShow&&u.default.createElement(g,{show:!0,issue:o,close:function(){e.setState({addWorklogShow:!1})},data:this.state.selectedWorklog,loading:w,add:k,edit:_,i18n:n}),this.state.delWorklogShow&&u.default.createElement(v,{show:!0,issue:o,close:function(){e.setState({delWorklogShow:!1})},data:this.state.selectedWorklog,loading:w,del:E,i18n:n}))}}],[{key:"propTypes",value:{i18n:s.PropTypes.object.isRequired,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,permissions:s.PropTypes.array.isRequired,issue:s.PropTypes.object.isRequired,options:s.PropTypes.object.isRequired,original_estimate:s.PropTypes.string,indexLoading:s.PropTypes.bool.isRequired,loading:s.PropTypes.bool.isRequired,indexWorklog:s.PropTypes.func.isRequired,sort:s.PropTypes.string.isRequired,sortWorklog:s.PropTypes.func.isRequired,addWorklog:s.PropTypes.func.isRequired,editWorklog:s.PropTypes.func.isRequired,delWorklog:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=b,e.exports=t.default}).call(this)}finally{}},337:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n1&&c.default.createElement("li",{key:"next"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,d.default.add(u,1)),title:"后页"},">")),s-i>u&&c.default.createElement("li",{key:"last"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,s),title:"尾页"},">>")))))}}],[{key:"propTypes",value:{query:l.PropTypes.object,refresh:l.PropTypes.func,total:l.PropTypes.number.isRequired,curPage:l.PropTypes.number,sizePerPage:l.PropTypes.number,paginationSize:l.PropTypes.number},enumerable:!0}]),t}(l.Component);t.default=f,e.exports=t.default}).call(this)}finally{}},1782:function(e,t,n){try{(function(){"use strict";function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function u(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return{actions:(0,h.bindActionCreators)(g,e)}}Object.defineProperty(t,"__esModule",{value:!0});var s=Object.assign||function(e){for(var t=1;t1&&c.default.createElement("li",{key:"next"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,p.default.add(n,1)),title:"后页"},">")),s-l>n&&c.default.createElement("li",{key:"last"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,s),title:"尾页"},">>")))))}}],[{key:"propTypes",value:{query:u.PropTypes.object,refresh:u.PropTypes.func,total:u.PropTypes.number.isRequired,curPage:u.PropTypes.number,sizePerPage:u.PropTypes.number,paginationSize:u.PropTypes.number},enumerable:!0}]),t}(u.Component);t.default=f,e.exports=t.default}).call(this)}finally{}},1055:function(e,t,r){try{(function(){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=Object.assign||function(e){for(var t=1;t1024*this.options.maxFilesize*1024?n(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):t.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(n(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,n):n(this.options.dictInvalidFileType)},t.prototype.addFile=function(e){return e.upload={progress:0,total:e.size,bytesSent:0},this.files.push(e),e.status=t.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(t){return function(n){return n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()}}(this))},t.prototype.enqueueFiles=function(e){var t,n,a;for(n=0,a=e.length;n=t)&&(a=this.getQueuedFiles(),a.length>0)){if(this.options.uploadMultiple)return this.processFiles(a.slice(0,t-n));for(;ed;)t=r[4*(l-1)+3],0===t?i=l:d=l,l=i+d>>1;return u=l/s,0===u?1:u},s=function(e,t,n,a,r,s,o,l,u,d){var c;return c=i(t),e.drawImage(t,n,a,r,s,o,l,u,d/c)},r=function(e,t){var n,a,r,i,s,o,l,u,d;if(r=!1,d=!0,a=e.document,u=a.documentElement,n=a.addEventListener?"addEventListener":"attachEvent",l=a.addEventListener?"removeEventListener":"detachEvent",o=a.addEventListener?"":"on",i=function(n){if("readystatechange"!==n.type||"complete"===a.readyState)return("load"===n.type?e:a)[l](o+n.type,i,!1),!r&&(r=!0)?t.call(e,n.type||n):void 0},s=function(){var e;try{u.doScroll("left")}catch(t){return e=t,void setTimeout(s,50)}return i("poll")},"complete"!==a.readyState){if(a.createEventObject&&u.doScroll){try{d=!e.frameElement}catch(c){}d&&s()}return a[n](o+"DOMContentLoaded",i,!1),a[n](o+"readystatechange",i,!1),e[n](o+"load",i,!1)}},t._autoDiscoverFunction=function(){if(t.autoDiscover)return t.discover()},r(window,t._autoDiscoverFunction)}).call(this)}).call(t,n(6)(e))},function(e,t,n){"use strict";var a=Object.prototype.hasOwnProperty,r=Object.prototype.toString,i=function(e){return"function"==typeof Array.isArray?Array.isArray(e):"[object Array]"===r.call(e)},s=function(e){if(!e||"[object Object]"!==r.call(e))return!1;var t=a.call(e,"constructor"),n=e.constructor&&e.constructor.prototype&&a.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!t&&!n)return!1;var i;for(i in e);return"undefined"==typeof i||a.call(e,i)};e.exports=function o(){var e,t,n,a,r,l,u=arguments[0],d=1,c=arguments.length,p=!1;for("boolean"==typeof u?(p=u,u=arguments[1]||{},d=2):("object"!=typeof u&&"function"!=typeof u||null==u)&&(u={});d
")}}),We[t.key]&&d.default.createElement(_.default,{mainSrc:i[Be],nextSrc:i[(Be+1)%i.length],prevSrc:i[(Be+i.length-1)%i.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.state.inlinePreviewShow[t.key]=!1,e.setState({inlinePreviewShow:e.state.inlinePreviewShow})},onMovePrevRequest:function(){return e.setState({photoIndex:(Be+i.length-1)%i.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(Be+1)%i.length})}}))}():a=u[t.key];return d.default.createElement(c.FormGroup,{key:"form-"+n},d.default.createElement(c.Col,{sm:3,componentClass:c.ControlLabel},t.name||"-"),d.default.createElement(c.Col,{sm:9},d.default.createElement("div",{style:{marginTop:"7px"}},a)))}}))),d.default.createElement(c.Tab,{eventKey:2,title:ot},d.default.createElement(E,{i18n:n,currentTime:G.current_time||0,currentUser:Ne,project:K,permissions:G.permissions||[],issue_id:u.id,collection:ce,indexComments:ue,sortComments:de,indexLoading:pe,loading:me,users:G.users||[],addComments:he,editComments:_e,delComments:ye,itemLoading:fe})),d.default.createElement(c.Tab,{eventKey:3,title:"改动纪录"},d.default.createElement(T,{issue_id:u.id,currentTime:G.current_time||0,currentUser:Ne,collection:be,indexHistory:ve,sortHistory:ge,indexLoading:Me})),d.default.createElement(c.Tab,{eventKey:4,title:lt},d.default.createElement(x,{i18n:n,currentTime:G.current_time||0,currentUser:Ne,permissions:G.permissions||[],issue:u,original_estimate:u.original_estimate,options:G.timetrack||{},collection:Ye,indexWorklog:Te,sort:Se,sortWorklog:xe,indexLoading:De,loading:Ce,addWorklog:Pe,editWorklog:Oe,delWorklog:je})),u.gitcommits_num>0&&d.default.createElement(c.Tab,{eventKey:5,title:ut},d.default.createElement(S,{issue_id:u.id,currentTime:G.current_time||0,currentUser:Ne,collection:Le,indexGitCommits:ke,sortGitCommits:we,indexLoading:Ee})))),Ge&&d.default.createElement(C,{show:!0,close:this.delFileModalClose,del:Z,data:Ke,loading:J,i18n:n}),this.state.editModalShow&&d.default.createElement(L,{show:!0,close:this.editModalClose.bind(this),options:G,edit:$,loading:V,project:K,data:u,isSubtask:u.parent_id&&!0,addLabels:ie,i18n:n}),this.state.workflowScreenShow&&d.default.createElement(L,{show:!0,close:this.workflowScreenModalClose.bind(this),options:G,edit:$,loading:V,project:K,data:u,action_id:Je,doAction:Ae,isFromWorkflow:!0,i18n:n}),this.state.workflowCommentsShow&&d.default.createElement(W,{show:!0,close:this.workflowCommentsModalClose.bind(this),data:u,action_id:Je,doAction:Ae}),this.state.createSubtaskModalShow&&d.default.createElement(L,{show:!0,close:this.createSubtaskModalClose.bind(this),options:G,create:X,loading:V,project:K,parent:u,isSubtask:!0,i18n:n}),this.state.previewModalShow&&d.default.createElement(D,{show:!0,close:function(){e.setState({previewModalShow:!1})},state:u.state,collection:oe}),this.state.linkIssueModalShow&&d.default.createElement(P,{show:!0,close:function(){e.setState({linkIssueModalShow:!1})},options:G,loading:He,createLink:Fe,issue:u,types:G.types,project:K,i18n:n}),this.state.delLinkModalShow&&d.default.createElement(O,{show:!0,close:function(){e.setState({delLinkModalShow:!1})},loading:He,delLink:Re,data:this.state.delLinkData,i18n:n}),this.state.convertTypeModalShow&&d.default.createElement(j,{show:!0,close:function(){e.setState({convertTypeModalShow:!1})},options:G,convert:ne,loading:V,issue:u,i18n:n}),this.state.convertType2ModalShow&&d.default.createElement(F,{show:!0,close:function(){e.setState({convertType2ModalShow:!1})},options:G,project:K,convert:ne,loading:V,issue:u,i18n:n}),this.state.moveModalShow&&d.default.createElement(R,{show:!0,close:function(){e.setState({moveModalShow:!1})},options:G,project:K,move:te,loading:V,issue:u,i18n:n}),this.state.assignModalShow&&d.default.createElement(H,{show:!0,close:function(){e.setState({assignModalShow:!1})},options:G,setAssignee:ae,issue:u,i18n:n}),this.state.setLabelsModalShow&&d.default.createElement(A,{show:!0,close:function(){e.setState({setLabelsModalShow:!1})},options:G,setLabels:re,addLabels:ie,issue:u,i18n:n}),this.state.shareModalShow&&d.default.createElement(N,{show:!0,project:K,close:function(){e.setState({shareModalShow:!1})},issue:u}),this.state.resetModalShow&&d.default.createElement(I,{show:!0,close:function(){e.setState({resetModalShow:!1})},options:G,resetState:se,issue:u,i18n:n}),this.state.delNotifyShow&&d.default.createElement(q,{show:!0,close:function(){e.setState({delNotifyShow:!1})},data:u,del:Q,detailClose:r,i18n:n}),this.state.copyModalShow&&d.default.createElement(B,{show:!0,close:function(){e.setState({copyModalShow:!1})},options:G,loading:V,copy:ee,data:u,i18n:n}),this.state.watchersModalShow&&d.default.createElement(z,{show:!0,close:function(){e.setState({watchersModalShow:!1})},issue_no:u.no,watchers:u.watchers||[],i18n:n}))}}],[{key:"propTypes",value:{i18n:u.PropTypes.object.isRequired,layout:u.PropTypes.object.isRequired,options:u.PropTypes.object.isRequired,project:u.PropTypes.object.isRequired,data:u.PropTypes.object.isRequired,record:u.PropTypes.func.isRequired,forward:u.PropTypes.func.isRequired,visitedIndex:u.PropTypes.number.isRequired,visitedCollection:u.PropTypes.array.isRequired,issueCollection:u.PropTypes.array.isRequired,show:u.PropTypes.func.isRequired,detailFloatStyle:u.PropTypes.object,wfCollection:u.PropTypes.array.isRequired,wfLoading:u.PropTypes.bool.isRequired,viewWorkflow:u.PropTypes.func.isRequired,loading:u.PropTypes.bool.isRequired,itemLoading:u.PropTypes.bool.isRequired,fileLoading:u.PropTypes.bool.isRequired,delFile:u.PropTypes.func.isRequired,addFile:u.PropTypes.func.isRequired,setAssignee:u.PropTypes.func.isRequired,setProgress:u.PropTypes.func.isRequired,setLabels:u.PropTypes.func.isRequired,addLabels:u.PropTypes.func.isRequired,create:u.PropTypes.func.isRequired,edit:u.PropTypes.func.isRequired,indexComments:u.PropTypes.func.isRequired,sortComments:u.PropTypes.func.isRequired,addComments:u.PropTypes.func.isRequired,editComments:u.PropTypes.func.isRequired,delComments:u.PropTypes.func.isRequired,commentsCollection:u.PropTypes.array.isRequired,commentsIndexLoading:u.PropTypes.bool.isRequired,commentsLoading:u.PropTypes.bool.isRequired,commentsItemLoading:u.PropTypes.bool.isRequired,commentsLoaded:u.PropTypes.bool.isRequired,indexWorklog:u.PropTypes.func.isRequired,worklogSort:u.PropTypes.string.isRequired,sortWorklog:u.PropTypes.func.isRequired,addWorklog:u.PropTypes.func.isRequired,editWorklog:u.PropTypes.func.isRequired,delWorklog:u.PropTypes.func.isRequired,worklogCollection:u.PropTypes.array.isRequired,worklogIndexLoading:u.PropTypes.bool.isRequired,worklogLoading:u.PropTypes.bool.isRequired,worklogLoaded:u.PropTypes.bool.isRequired,indexHistory:u.PropTypes.func.isRequired,sortHistory:u.PropTypes.func.isRequired,historyCollection:u.PropTypes.array.isRequired,historyIndexLoading:u.PropTypes.bool.isRequired,historyLoaded:u.PropTypes.bool.isRequired,indexGitCommits:u.PropTypes.func.isRequired,sortGitCommits:u.PropTypes.func.isRequired,gitCommitsCollection:u.PropTypes.array.isRequired,gitCommitsIndexLoading:u.PropTypes.bool.isRequired,gitCommitsLoaded:u.PropTypes.bool.isRequired,createLink:u.PropTypes.func.isRequired,delLink:u.PropTypes.func.isRequired,linkLoading:u.PropTypes.bool.isRequired,doAction:u.PropTypes.func.isRequired,watch:u.PropTypes.func.isRequired,copy:u.PropTypes.func.isRequired,move:u.PropTypes.func.isRequired,convert:u.PropTypes.func.isRequired,resetState:u.PropTypes.func.isRequired,del:u.PropTypes.func.isRequired,close:u.PropTypes.func.isRequired,user:u.PropTypes.object.isRequired},enumerable:!0}]),t}(u.Component);t.default=V,e.exports=t.default}).call(this)}finally{}},300:function(e,t,n){try{(function(){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n
"),_react2.default.createElement(_reactBootstrap.Panel,{header:header,key:i,style:{margin:"5px"}},_react2.default.createElement("div",{onClick:_this3.previewInlineImg.bind(_this3),style:{lineHeight:"24px",whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:contents}}),inlinePreviewShow[val.id]&&_react2.default.createElement(_reactImageLightbox2.default,{mainSrc:imgFileUrls[photoIndex],nextSrc:imgFileUrls[(photoIndex+1)%imgFileUrls.length],prevSrc:imgFileUrls[(photoIndex+imgFileUrls.length-1)%imgFileUrls.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){_this3.state.inlinePreviewShow[val.id]=!1,_this3.setState({inlinePreviewShow:_this3.state.inlinePreviewShow})},onMovePrevRequest:function(){return _this3.setState({photoIndex:(photoIndex+imgFileUrls.length-1)%imgFileUrls.length})},onMoveNextRequest:function(){return _this3.setState({photoIndex:(photoIndex+1)%imgFileUrls.length})}}),val.reply&&val.reply.length>0&&_react2.default.createElement("div",{className:"reply-region"},_react2.default.createElement("ul",{className:"reply-contents"},_lodash2.default.map(val.reply,function(v,i){var contents=v.contents?_lodash2.default.escape(v.contents):"-",images=contents.match(/!\[.*?\]\(http(s)?:\/\/(.*?)\)((\r\n)|(\n))?/gi),imgFileUrls=[];images&&(_lodash2.default.forEach(images,function(e,t){var n=e.match(/http(s)?:\/\/([^\)]+)/gi),a=new RegExp("^http[s]?://[^/]+(.+)$");a.exec(n[0]);var r=RegExp.$1;contents=contents.replace(e,'
"),_react2.default.createElement("li",{className:"reply-contents-item"},_react2.default.createElement("div",{className:"reply-item-header"},_react2.default.createElement("span",{dangerouslySetInnerHTML:{__html:''+(v.creator&&v.creator.id===currentUser.id?"我":v.creator.name)+" - "+("absolute"==_this3.state.displayTimeFormat?moment.unix(val.created_at).format("YYYY/MM/DD HH:mm:ss"):(0,_shareFuncs.getAgoAt)(val.created_at,currentTime))+(1==v.edited_flag?' - 已编辑':"")}}),(v.creator&¤tUser.id===v.creator.id&&permissions.indexOf("delete_self_comments")!==-1||permissions.indexOf("delete_comments")!==-1)&&_react2.default.createElement("span",{className:"comments-button comments-edit-button",style:{marginRight:"10px","float":"right"},onClick:_this3.showDelReply.bind(_this3,val.id,v),title:"删除"},_react2.default.createElement("i",{className:"fa fa-trash"})),(v.creator&¤tUser.id===v.creator.id&&permissions.indexOf("edit_self_comments")!==-1||permissions.indexOf("edit_comments")!==-1)&&_react2.default.createElement("span",{className:"comments-button comments-edit-button",style:{marginRight:"10px","float":"right"},onClick:_this3.showEditReply.bind(_this3,val.id,v),title:"编辑"},_react2.default.createElement("i",{className:"fa fa-pencil"})),permissions.indexOf("add_comments")!==-1&&_react2.default.createElement("span",{className:"comments-button comments-edit-button",style:{marginRight:"10px","float":"right"},onClick:_this3.showAddReply.bind(_this3,val.id,v.creator),title:"回复"},_react2.default.createElement("i",{className:"fa fa-reply"}))),_react2.default.createElement("div",{onClick:_this3.previewInlineImg.bind(_this3),style:{lineHeight:"24px",whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:contents}}),inlinePreviewShow[v.id]&&_react2.default.createElement(_reactImageLightbox2.default,{mainSrc:imgFileUrls[photoIndex],nextSrc:imgFileUrls[(photoIndex+1)%imgFileUrls.length],prevSrc:imgFileUrls[(photoIndex+imgFileUrls.length-1)%imgFileUrls.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){_this3.state.inlinePreviewShow[v.id]=!1,_this3.setState({inlinePreviewShow:_this3.state.inlinePreviewShow})},onMovePrevRequest:function(){return _this3.setState({photoIndex:(photoIndex+imgFileUrls.length-1)%imgFileUrls.length})},onMoveNextRequest:function(){return _this3.setState({photoIndex:(photoIndex+1)%imgFileUrls.length})}}))}))))}))),this.state.editCommentsShow&&_react2.default.createElement(EditCommentsModal,{show:!0,close:function(){_this3.setState({editCommentsShow:!1})},data:this.state.selectedComments,loading:itemLoading,users:users,project:project,permissions:permissions,issue_id:issue_id,edit:editComments,i18n:i18n}),this.state.delReplyShow&&_react2.default.createElement(DelReplyModal,{show:!0,close:function(){_this3.setState({delReplyShow:!1})},data:this.state.selectedComments,loading:itemLoading,issue_id:issue_id,edit:editComments,i18n:i18n}),this.state.delCommentsShow&&_react2.default.createElement(DelCommentsModal,{show:!0,close:function(){_this3.setState({delCommentsShow:!1})},data:this.state.selectedComments,loading:itemLoading,issue_id:issue_id,del:delComments,i18n:i18n}))}}],[{key:"propTypes",value:{i18n:_react.PropTypes.object.isRequired,currentTime:_react.PropTypes.number.isRequired,currentUser:_react.PropTypes.object.isRequired,project:_react.PropTypes.object.isRequired,permissions:_react.PropTypes.array.isRequired,indexLoading:_react.PropTypes.bool.isRequired,loading:_react.PropTypes.bool.isRequired,itemLoading:_react.PropTypes.bool.isRequired,indexComments:_react.PropTypes.func.isRequired,sortComments:_react.PropTypes.func.isRequired,addComments:_react.PropTypes.func.isRequired,editComments:_react.PropTypes.func.isRequired,delComments:_react.PropTypes.func.isRequired,users:_react.PropTypes.array.isRequired,collection:_react.PropTypes.array.isRequired,issue_id:_react.PropTypes.string},enumerable:!0}]),Comments}(_react.Component);exports.default=Comments,module.exports=exports.default}).call(this)}finally{}},304:function(e,t,n){try{(function(){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n
"):e.before_value}})),u.default.createElement("td",null,u.default.createElement("div",{style:{whiteSpace:"pre-wrap",wordWrap:"break-word",width:"190px"},dangerouslySetInnerHTML:{__html:m.default.isString(e.after_value)?m.default.escape(e.after_value).replace(/(\r\n)|(\n)/g,"
"):e.after_value}})))}))):u.default.createElement("span",{style:{marginLeft:"5px"}},"创建问题"))}))))}}],[{key:"propTypes",value:{issue_id:l.PropTypes.string,currentTime:l.PropTypes.number.isRequired,currentUser:l.PropTypes.object.isRequired,indexLoading:l.PropTypes.bool.isRequired,indexHistory:l.PropTypes.func.isRequired,sortHistory:l.PropTypes.func.isRequired,collection:l.PropTypes.array.isRequired},enumerable:!0}]),t}(l.Component);t.default=y,e.exports=t.default}).call(this)}finally{}},309:function(e,t,n){try{(function(){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n
"),u.default.createElement(c.Panel,{header:s,key:n,style:{margin:"5px"}},u.default.createElement(c.Table,{condensed:!0,hover:!0,responsive:!0},u.default.createElement("thead",null,u.default.createElement("tr",null,u.default.createElement("th",null,"开始日期"),u.default.createElement("th",null,"耗费时间"),u.default.createElement("th",null,"剩余时间"))),u.default.createElement("tbody",null,u.default.createElement("tr",null,u.default.createElement("td",null,_.unix(t.started_at).format("YYYY/MM/DD HH:mm:ss")),u.default.createElement("td",null,t.spend||"-"),u.default.createElement("td",null,void 0===t.leave_estimate_m?"-":e.m2t(t.leave_estimate_m))))),u.default.createElement("div",{style:{marginLeft:"5px",lineHeight:"24px"}},u.default.createElement("span",{style:{width:"10%","float":"left",fontWeight:"bold"}},"备注:"),u.default.createElement("span",{style:{width:"90%","float":"left",whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:o}})))}))),this.state.addWorklogShow&&u.default.createElement(y,{show:!0,issue:s,close:function(){e.setState({addWorklogShow:!1})},data:this.state.selectedWorklog,loading:b,add:M,edit:k,i18n:n}),this.state.delWorklogShow&&u.default.createElement(v,{show:!0,issue:s,close:function(){e.setState({delWorklogShow:!1})},data:this.state.selectedWorklog,loading:b,del:w,i18n:n}))}}],[{key:"propTypes",value:{i18n:l.PropTypes.object.isRequired,currentTime:l.PropTypes.number.isRequired,currentUser:l.PropTypes.object.isRequired,permissions:l.PropTypes.array.isRequired,issue:l.PropTypes.object.isRequired,options:l.PropTypes.object.isRequired,original_estimate:l.PropTypes.string,indexLoading:l.PropTypes.bool.isRequired,loading:l.PropTypes.bool.isRequired,indexWorklog:l.PropTypes.func.isRequired,sort:l.PropTypes.string.isRequired,sortWorklog:l.PropTypes.func.isRequired,addWorklog:l.PropTypes.func.isRequired,editWorklog:l.PropTypes.func.isRequired,delWorklog:l.PropTypes.func.isRequired,collection:l.PropTypes.array.isRequired},enumerable:!0}]),t}(l.Component);t.default=g,e.exports=t.default}).call(this)}finally{}},311:function(e,t,n){try{(function(){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n
"):"-";n[e.key]=u.default.createElement("span",{style:ze,dangerouslySetInnerHTML:{__html:o}})}else{var o="";"sprints"===e.key?o=t.sprints&&t.sprints.length>0?t.sprints.join(","):"-":"SingleUser"===e.type?o=t[e.key].name:"MultiUser"===e.type?o=f.default.map(t[e.key],function(e){return e.name}).join(","):["Select","RadioGroup","SingleVersion"].indexOf(e.type)!==-1?o=f.default.findIndex(e.optionValues||[],{id:t[e.key]})===-1?"-":f.default.find(e.optionValues,{id:t[e.key]}).name:["MultiSelect","CheckboxGroup","MultiVersion"].indexOf(e.type)!==-1?!function(){var n=f.default.isArray(t[e.key])?t[e.key]:t[e.key].split(","),a=[];f.default.forEach(n,function(t){var n=f.default.findIndex(e.optionValues||[],{id:t})!==-1?f.default.find(e.optionValues,{id:t}).name:"";n&&a.push(n)}),o=a.length>0?f.default.uniq(a).join(","):"-"}():o="DatePicker"===e.type?y.unix(t[e.key]).format("YYYY/MM/DD"):"DateTimePicker"===e.type?y.unix(t[e.key]).format("YYYY/MM/DD HH:mm"):t[e.key]+("progress"==e.key?"%":""),n[e.key]=u.default.createElement("span",{style:ze},o)}}),Ze.push(n)});var Xe={};return l?Xe.noDataText=u.default.createElement("div",null,u.default.createElement("img",{src:b,className:"loading"})):Xe.noDataText="暂无数据显示。",Xe.onRowMouseOver=this.onRowMouseOver.bind(this),u.default.createElement("div",null,u.default.createElement(d.BootstrapTable,{hover:!0,data:Ze,bordered:!1,options:Xe,trClassName:"tr-top",headerStyle:{overflow:"unset"}},u.default.createElement(d.TableHeaderColumn,{dataField:"id",hidden:!0,isKey:!0},"ID"),u.default.createElement(d.TableHeaderColumn,{width:"50",dataField:"type"},u.default.createElement("span",{className:"table-header",onClick:this.orderBy.bind(this,"type")},"类型","type"===Ue.field&&("desc"===Ue.order?u.default.createElement("i",{className:"fa fa-arrow-down"}):u.default.createElement("i",{className:"fa fa-arrow-up"})))),u.default.createElement(d.TableHeaderColumn,{dataField:"no",width:"50"},u.default.createElement("span",{className:"table-header",onClick:this.orderBy.bind(this,"no")},"NO","no"===Ue.field&&("desc"===Ue.order?u.default.createElement("i",{className:"fa fa-arrow-down"}):u.default.createElement("i",{className:"fa fa-arrow-up"})))),u.default.createElement(d.TableHeaderColumn,{dataField:"name"},u.default.createElement("span",{className:"table-header",onClick:this.orderBy.bind(this,"title")},"主题","title"===Ue.field&&("desc"===Ue.order?u.default.createElement("i",{className:"fa fa-arrow-down"}):u.default.createElement("i",{className:"fa fa-arrow-up"})))),f.default.map(Ve,function(t,n){return u.default.createElement(d.TableHeaderColumn,{width:t.width||"100",dataField:t.key,key:n},u.default.createElement("span",{className:"table-header",onClick:t.sortKey?e.orderBy.bind(e,t.sortKey):null},t.name,Ue.field===t.sortKey&&("desc"===Ue.order?u.default.createElement("i",{className:"fa fa-arrow-down"}):u.default.createElement("i",{className:"fa fa-arrow-up"}))))}),u.default.createElement(d.TableHeaderColumn,{width:"60",dataField:"operation"})),this.state.barShow&&u.default.createElement(g,{i18n:n,layout:a,create:N,edit:A,del:H,setAssignee:I,setProgress:W,setLabels:q,addLabels:B,close:this.closeDetail,options:_,data:s,record:O,forward:j,visitedIndex:F,visitedCollection:R,issueCollection:r,show:P,itemLoading:m,loading:o,fileLoading:J,project:U,delFile:G,addFile:K,wfCollection:Z,wfLoading:X,viewWorkflow:$,indexComments:Q,sortComments:ee,commentsCollection:te,commentsIndexLoading:ne,commentsLoading:ae,commentsItemLoading:le,commentsLoaded:re,addComments:ie,editComments:se,delComments:oe,indexWorklog:ue,worklogSort:de,sortWorklog:ce,worklogCollection:pe,worklogIndexLoading:me,worklogLoading:fe,worklogLoaded:he,addWorklog:_e,editWorklog:ye,delWorklog:ve,indexHistory:ge,sortHistory:be,historyCollection:Me,historyIndexLoading:ke,historyLoaded:we,indexGitCommits:Le,sortGitCommits:Ee,gitCommitsCollection:Te,gitCommitsIndexLoading:Se,gitCommitsLoaded:xe,linkLoading:Ce,createLink:Ye,delLink:De,watch:Pe,copy:Oe,move:je,convert:Fe,resetState:Re,doAction:He,user:Ae}),!l&&_.total&&_.total>0?u.default.createElement(M,{total:_.total||0,curPage:z.page?z.page-0:1,sizePerPage:_.sizePerPage||50,paginationSize:4,query:z,refresh:V}):"",this.state.delNotifyShow&&u.default.createElement(v,{show:!0,close:this.delNotifyClose,data:qe,loading:m,del:H,i18n:n}),this.state.addWorklogShow&&u.default.createElement(k,{show:!0,issue:qe,close:function(){e.setState({addWorklogShow:!1})},loading:fe,add:_e,i18n:n}),this.state.editModalShow&&u.default.createElement(w,{show:!0,close:function(){e.setState({editModalShow:!1})},options:_,addLabels:B,loading:o,project:U,edit:A,isSubtask:qe.parent_id&&!0,data:qe,i18n:n}),this.state.createSubtaskModalShow&&u.default.createElement(w,{show:!0,close:function(){e.setState({createSubtaskModalShow:!1})},options:_,create:N,loading:o,project:U,parent:qe,isSubtask:!0,i18n:n}),this.state.convertTypeModalShow&&u.default.createElement(L,{show:!0,close:function(){e.setState({convertTypeModalShow:!1})},options:_,convert:Fe,loading:o,issue:qe,i18n:n}),this.state.convertType2ModalShow&&u.default.createElement(E,{show:!0,close:function(){e.setState({convertType2ModalShow:!1})},options:_,project:U,convert:Fe,loading:o,issue:qe,i18n:n}),this.state.moveModalShow&&u.default.createElement(T,{show:!0,close:function(){e.setState({moveModalShow:!1})},options:_,project:U,move:je,loading:o,issue:qe,i18n:n}),this.state.assignModalShow&&u.default.createElement(S,{show:!0,close:function(){e.setState({assignModalShow:!1})},options:_,setAssignee:I,issue:qe,i18n:n}),this.state.setLabelsModalShow&&u.default.createElement(x,{show:!0,close:function(){e.setState({setLabelsModalShow:!1})},options:_,setLabels:q,addLabels:B,issue:qe,i18n:n}),this.state.shareModalShow&&u.default.createElement(Y,{show:!0,close:function(){e.setState({shareModalShow:!1})},project:U,issue:qe}),this.state.resetModalShow&&u.default.createElement(D,{show:!0,close:function(){e.setState({resetModalShow:!1})},options:_,resetState:Re,issue:qe,i18n:n}),this.state.copyModalShow&&u.default.createElement(C,{show:!0,close:function(){e.setState({copyModalShow:!1})},options:_,loading:o,copy:Oe,data:qe,i18n:n}))}}],[{key:"propTypes",value:{i18n:l.PropTypes.object.isRequired,layout:l.PropTypes.object.isRequired,collection:l.PropTypes.array.isRequired,wfCollection:l.PropTypes.array.isRequired,wfLoading:l.PropTypes.bool.isRequired,viewWorkflow:l.PropTypes.func.isRequired,indexComments:l.PropTypes.func.isRequired,sortComments:l.PropTypes.func.isRequired,addComments:l.PropTypes.func.isRequired,editComments:l.PropTypes.func.isRequired,delComments:l.PropTypes.func.isRequired,commentsCollection:l.PropTypes.array.isRequired,commentsIndexLoading:l.PropTypes.bool.isRequired,commentsLoading:l.PropTypes.bool.isRequired,commentsItemLoading:l.PropTypes.bool.isRequired,commentsLoaded:l.PropTypes.bool.isRequired,indexWorklog:l.PropTypes.func.isRequired,worklogSort:l.PropTypes.string.isRequired,sortWorklog:l.PropTypes.func.isRequired,addWorklog:l.PropTypes.func.isRequired,editWorklog:l.PropTypes.func.isRequired,delWorklog:l.PropTypes.func.isRequired,worklogCollection:l.PropTypes.array.isRequired,worklogIndexLoading:l.PropTypes.bool.isRequired,worklogLoading:l.PropTypes.bool.isRequired,worklogLoaded:l.PropTypes.bool.isRequired,indexHistory:l.PropTypes.func.isRequired,sortHistory:l.PropTypes.func.isRequired,historyCollection:l.PropTypes.array.isRequired,historyIndexLoading:l.PropTypes.bool.isRequired,historyLoaded:l.PropTypes.bool.isRequired,indexGitCommits:l.PropTypes.func.isRequired,sortGitCommits:l.PropTypes.func.isRequired,gitCommitsCollection:l.PropTypes.array.isRequired,gitCommitsIndexLoading:l.PropTypes.bool.isRequired,gitCommitsLoaded:l.PropTypes.bool.isRequired,itemData:l.PropTypes.object.isRequired,project:l.PropTypes.object,options:l.PropTypes.object,loading:l.PropTypes.bool.isRequired,itemLoading:l.PropTypes.bool.isRequired,indexLoading:l.PropTypes.bool.isRequired,index:l.PropTypes.func.isRequired,refresh:l.PropTypes.func.isRequired,query:l.PropTypes.object,show:l.PropTypes.func.isRequired,edit:l.PropTypes.func.isRequired,create:l.PropTypes.func.isRequired,setAssignee:l.PropTypes.func.isRequired,setProgress:l.PropTypes.func.isRequired,setLabels:l.PropTypes.func.isRequired,addLabels:l.PropTypes.func.isRequired,fileLoading:l.PropTypes.bool.isRequired,delFile:l.PropTypes.func.isRequired,addFile:l.PropTypes.func.isRequired,record:l.PropTypes.func.isRequired,forward:l.PropTypes.func.isRequired,cleanRecord:l.PropTypes.func.isRequired,visitedIndex:l.PropTypes.number.isRequired,visitedCollection:l.PropTypes.array.isRequired,createLink:l.PropTypes.func.isRequired,delLink:l.PropTypes.func.isRequired,linkLoading:l.PropTypes.bool.isRequired,doAction:l.PropTypes.func.isRequired,watch:l.PropTypes.func.isRequired,copy:l.PropTypes.func.isRequired,move:l.PropTypes.func.isRequired,convert:l.PropTypes.func.isRequired,resetState:l.PropTypes.func.isRequired,del:l.PropTypes.func.isRequired,user:l.PropTypes.object.isRequired},enumerable:!0}]),t}(l.Component);t.default=P,e.exports=t.default}).call(this)}finally{}},1800:function(e,t,n){try{(function(){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n'+this.options.dictRemoveFile+""),e.previewElement.appendChild(e._removeLink)),r=function(n){return function(r){return r.preventDefault(),r.stopPropagation(),e.status===t.UPLOADING?t.confirm(n.options.dictCancelUploadConfirmation,function(){return n.removeFile(e)}):n.options.dictRemoveFileConfirmation?t.confirm(n.options.dictRemoveFileConfirmation,function(){return n.removeFile(e)}):n.removeFile(e)}}(this),f=e.previewElement.querySelectorAll("[data-dz-remove]"),h=[],l=0,c=f.length;l=t){r=e/Math.pow(this.options.filesizeBase,4-n),a=o;break}r=Math.round(10*r)/10}return""+r+" "+a},t.prototype._updateMaxFilesReachedClass=function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")},t.prototype.drop=function(e){var t,n;e.dataTransfer&&(this.emit("drop",e),t=e.dataTransfer.files,this.emit("addedfiles",t),t.length&&(n=e.dataTransfer.items,n&&n.length&&null!=n[0].webkitGetAsEntry?this._addFilesFromItems(n):this.handleFiles(t)))},t.prototype.paste=function(e){var t,n;if(null!=(null!=e&&null!=(n=e.clipboardData)?n.items:void 0))return this.emit("paste",e),t=e.clipboardData.items,t.length?this._addFilesFromItems(t):void 0},t.prototype.handleFiles=function(e){var t,n,r,a;for(a=[],n=0,r=e.length;n1&&c.default.createElement("li",{key:"next"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,p.default.add(a,1)),title:"后页"},">")),s-l>a&&c.default.createElement("li",{key:"last"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,s),title:"尾页"},">>")))))}}],[{key:"propTypes",value:{query:u.PropTypes.object,refresh:u.PropTypes.func,total:u.PropTypes.number.isRequired,curPage:u.PropTypes.number,sizePerPage:u.PropTypes.number,paginationSize:u.PropTypes.number},enumerable:!0}]),t}(u.Component);t.default=f,e.exports=t.default}).call(this)}finally{}},87:function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t
"+o(p.message+"",!0)+"";throw p}}var d={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:s,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:s,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:s,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};d.bullet=/(?:[*+-]|\d+\.)/,d.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,d.item=l(d.item,"gm")(/bull/g,d.bullet)(),d.list=l(d.list)(/bull/g,d.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+d.def.source+")")(),d.blockquote=l(d.blockquote)("def",d.def)(),d._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",d.html=l(d.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/
1&&l.length>1||(e=o.slice(c+1).join("\n")+e,c=p-1)),a=r||/\n\n(?!\s*$)/.test(s),c!==p-1&&(r="\n"===s.charAt(s.length-1),a||(a=r)),this.tokens.push({type:a?"loose_item_start":"list_item_start"}),this.token(s,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(o=this.rules.html.exec(e))e=e.substring(o[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===o[1]||"script"===o[1]||"style"===o[1]),text:o[0]});else if(!n&&t&&(o=this.rules.def.exec(e)))e=e.substring(o[0].length),this.tokens.links[o[1].toLowerCase()]={href:o[2],title:o[3]};else if(t&&(o=this.rules.table.exec(e))){for(e=e.substring(o[0].length),s={type:"table",header:o[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:o[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:o[3].replace(/(?: *\| *)?\n$/,"").split("\n")},c=0;c "+e+"
\n":"'+(n?e:o(e,!0))+"\n
"},r.prototype.blockquote=function(e){return""+(n?e:o(e,!0))+"\n\n"+e+"
\n"},r.prototype.html=function(e){return e},r.prototype.heading=function(e,t,n){return"
\n":"
\n"},r.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+""+n+">\n"},r.prototype.listitem=function(e){return"\n\n"+e+"\n\n"+t+"\n
\n"},r.prototype.tablerow=function(e){return"\n"+e+" \n"},r.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+""+n+">\n"},r.prototype.strong=function(e){return""+e+""},r.prototype.em=function(e){return""+e+""},r.prototype.codespan=function(e){return""+e+""},r.prototype.br=function(){return this.options.xhtml?"
":"
"},r.prototype.del=function(e){return""+e+""},r.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(a){return""}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:"))return""}var o='"+n+""},r.prototype.image=function(e,t,n){var r='":">"},r.prototype.text=function(e){return e},a.parse=function(e,t,n){var r=new a(t,n);return r.parse(e)},a.prototype.parse=function(e){this.inline=new n(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},a.prototype.next=function(){return this.token=this.tokens.pop()},a.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},a.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},a.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,a,o="",i="";for(n="",e=0;e
'),r.push(i)}}),t=t.replace(/<\/div>(\s*?)
"),imgFiles:r}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void c.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var r=-1;0===n.indexOf("inlineimg-")&&(r=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:r}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,r=t.onEdit,a=t.fieldKey,o=t.value,i=void 0===o?"":o,l=this.state,u=l.inlinePreviewShow,c=l.photoIndex,d=this.extractImg(a,i),p=d.html,f=d.imgFiles;return s.default.createElement("div",{className:"issue-text-field"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){r&&r()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:p||'未设置'}}),u&&s.default.createElement(h.default,{mainSrc:f[c],nextSrc:f[(c+1)%f.length],prevSrc:f[(c+f.length-1)%f.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(c+f.length-1)%f.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(c+1)%f.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={MultiRowsTextEditor:y,MultiRowsTextReader:g}}).call(this)}finally{}},106:function(e,t,n){try{(function(){"use strict";function t(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var o=function(){function e(e,t){for(var n=0;n$');if(o.exec(t)){var i=RegExp.$1;if(!i)return;n=n.replace(t,'
'),a.push(i)}}),{html:n,imgFiles:a}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void d.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var r=-1;0===n.indexOf("inlineimg-")&&(r=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:r}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,r=t.onEdit,a=t.fieldKey,o=t.value,i=this.state,l=i.inlinePreviewShow,u=i.photoIndex,c=this.extractImg(a,o||""),d=c.html,p=c.imgFiles;return s.default.createElement("div",{className:"issue-text-field markdown-body"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){r&&r()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:d||'未设置'}}),l&&s.default.createElement(f.default,{mainSrc:p[u],nextSrc:p[(u+1)%p.length],prevSrc:p[(u+p.length-1)%p.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(u+p.length-1)%p.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(u+1)%p.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={RichTextEditor:g,RichTextReader:v}}).call(this)}finally{}},112:function(e,t,n){var r;!function(){"use strict";var a=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:a,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:a&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:a&&!!window.screen};r=function(){return o}.call(t,n,t,e),!(void 0!==r&&(e.exports=r))}()},115:function(e,t,n){function r(e){return e()}var a=n(1),o=n(13),i=n(71),l=n(25),s=n(112),u=a.createFactory(n(116)),c=n(117),d=n(119),p=n(207),f=n(13).unstable_renderSubtreeIntoContainer,h=n(70),m=n(69),y=s.canUseDOM?window.HTMLElement:{},g=s.canUseDOM?document.body:{appendChild:function(){}},v=m({displayName:"Modal",statics:{setAppElement:function(e){g=c.setElement(e)},injectCSS:function(){}},propTypes:{isOpen:l.bool.isRequired,style:l.shape({content:l.object,overlay:l.object}),portalClassName:l.string,bodyOpenClassName:l.string,appElement:l.instanceOf(y),onAfterOpen:l.func,onRequestClose:l.func,closeTimeoutMS:l.number,ariaHideApp:l.bool,shouldCloseOnOverlayClick:l.bool,parentSelector:l.func,role:l.string,contentLabel:l.string.isRequired},getDefaultProps:function(){return{isOpen:!1,portalClassName:"ReactModalPortal",bodyOpenClassName:"ReactModal__Body--open",ariaHideApp:!0,closeTimeoutMS:0,shouldCloseOnOverlayClick:!0,parentSelector:function(){return document.body}}},componentDidMount:function(){this.node=document.createElement("div"),this.node.className=this.props.portalClassName,this.props.isOpen&&d.add(this);var e=r(this.props.parentSelector);e.appendChild(this.node),this.renderPortal(this.props)},componentWillUpdate:function(e){e.portalClassName!==this.props.portalClassName&&(this.node.className=e.portalClassName)},componentWillReceiveProps:function(e){e.isOpen&&d.add(this),e.isOpen||d.remove(this);var t=r(this.props.parentSelector),n=r(e.parentSelector);n!==t&&(t.removeChild(this.node),n.appendChild(this.node)),this.renderPortal(e)},componentWillUnmount:function(){if(this.node){d.remove(this),this.props.ariaHideApp&&c.show(this.props.appElement);var e=this.portal.state,t=Date.now(),n=e.isOpen&&this.props.closeTimeoutMS&&(e.closesAt||t+this.props.closeTimeoutMS);if(n){e.beforeClose||this.portal.closeWithTimeout();var r=this;setTimeout(function(){r.removePortal()},n-t)}else this.removePortal()}},removePortal:function(){o.unmountComponentAtNode(this.node);var e=r(this.props.parentSelector);e.removeChild(this.node),0===d.count()&&p(document.body).remove(this.props.bodyOpenClassName)},renderPortal:function(e){e.isOpen||d.count()>0?p(document.body).add(this.props.bodyOpenClassName):p(document.body).remove(this.props.bodyOpenClassName),e.ariaHideApp&&c.toggle(e.isOpen,e.appElement),this.portal=f(this,u(h({},e,{defaultStyles:v.defaultStyles})),this.node)},render:function(){return i.noscript()}});v.defaultStyles={overlay:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(255, 255, 255, 0.75)"},content:{position:"absolute",top:"40px",left:"40px",right:"40px",bottom:"40px",border:"1px solid #ccc",background:"#fff",overflow:"auto",WebkitOverflowScrolling:"touch",borderRadius:"4px",outline:"none",padding:"20px"}},e.exports=v},116:function(e,t,n){var r=(n(1),n(71)),a=n(118),o=n(120),i=n(70),l=n(69),s=r.div,u={overlay:"ReactModal__Overlay",content:"ReactModal__Content"};e.exports=l({displayName:"ModalPortal",shouldClose:null,getDefaultProps:function(){return{style:{overlay:{},content:{}}}},getInitialState:function(){return{afterOpen:!1,beforeClose:!1}},componentDidMount:function(){this.props.isOpen&&(this.setFocusAfterRender(!0),this.open())},componentWillUnmount:function(){clearTimeout(this.closeTimer)},componentWillReceiveProps:function(e){!this.props.isOpen&&e.isOpen?(this.setFocusAfterRender(!0),this.open()):this.props.isOpen&&!e.isOpen&&this.close()},componentDidUpdate:function(){this.focusAfterRender&&(this.focusContent(),this.setFocusAfterRender(!1))},setFocusAfterRender:function(e){this.focusAfterRender=e},afterClose:function(){a.returnFocus(),a.teardownScopedFocus()},open:function(){this.state.afterOpen&&this.state.beforeClose?(clearTimeout(this.closeTimer),this.setState({beforeClose:!1})):(a.setupScopedFocus(this.node),a.markForFocusLater(),this.setState({isOpen:!0},function(){this.setState({afterOpen:!0}),this.props.isOpen&&this.props.onAfterOpen&&this.props.onAfterOpen()}.bind(this)))},close:function(){this.props.closeTimeoutMS>0?this.closeWithTimeout():this.closeWithoutTimeout()},focusContent:function(){this.contentHasFocus()||this.refs.content.focus()},closeWithTimeout:function(){var e=Date.now()+this.props.closeTimeoutMS;this.setState({beforeClose:!0,closesAt:e},function(){this.closeTimer=setTimeout(this.closeWithoutTimeout,this.state.closesAt-Date.now())}.bind(this))},closeWithoutTimeout:function(){this.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},this.afterClose)},handleKeyDown:function(e){9==e.keyCode&&o(this.refs.content,e),27==e.keyCode&&(e.preventDefault(),this.requestClose(e))},handleOverlayOnClick:function(e){null===this.shouldClose&&(this.shouldClose=!0),this.shouldClose&&this.props.shouldCloseOnOverlayClick&&(this.ownerHandlesClose()?this.requestClose(e):this.focusContent()),this.shouldClose=null},handleContentOnClick:function(){this.shouldClose=!1},requestClose:function(e){this.ownerHandlesClose()&&this.props.onRequestClose(e)},ownerHandlesClose:function(){return this.props.onRequestClose},shouldBeClosed:function(){return!this.state.isOpen&&!this.state.beforeClose},contentHasFocus:function(){return document.activeElement===this.refs.content||this.refs.content.contains(document.activeElement)},buildClassName:function(e,t){var n="object"==typeof t?t:{base:u[e],afterOpen:u[e]+"--after-open",beforeClose:u[e]+"--before-close"},r=n.base;return this.state.afterOpen&&(r+=" "+n.afterOpen),this.state.beforeClose&&(r+=" "+n.beforeClose),"string"==typeof t&&t?[r,t].join(" "):r},render:function(){var e=this.props.className?{}:this.props.defaultStyles.content,t=this.props.overlayClassName?{}:this.props.defaultStyles.overlay;return this.shouldBeClosed()?s():s({ref:"overlay",className:this.buildClassName("overlay",this.props.overlayClassName),style:i({},t,this.props.style.overlay||{}),onClick:this.handleOverlayOnClick},s({ref:"content",style:i({},e,this.props.style.content||{}),className:this.buildClassName("content",this.props.className),tabIndex:"-1",onKeyDown:this.handleKeyDown,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.props.children))}})},117:function(e,t){function n(e){if("string"==typeof e){var t=document.querySelectorAll(e);e="length"in t?t[0]:t}return s=e||s}function r(e){i(e),(e||s).setAttribute("aria-hidden","true")}function a(e){i(e),(e||s).removeAttribute("aria-hidden")}function o(e,t){e?r(t):a(t)}function i(e){if(!e&&!s)throw new Error("react-modal: You must set an element with `Modal.setAppElement(el)` to make this accessible")}function l(){s=document.body}var s="undefined"!=typeof document?document.body:null;t.toggle=o,t.setElement=n,t.show=a,t.hide=r,t.resetForTesting=l},118:function(e,t,n){function r(e){s=!0}function a(e){if(s){if(s=!1,!l)return;setTimeout(function(){if(!l.contains(document.activeElement)){var e=o(l)[0]||l;e.focus()}},0)}}var o=n(72),i=[],l=null,s=!1;t.markForFocusLater=function(){i.push(document.activeElement)},t.returnFocus=function(){var e=null;try{return e=i.pop(),void e.focus()}catch(t){}},t.setupScopedFocus=function(e){l=e,window.addEventListener?(window.addEventListener("blur",r,!1),document.addEventListener("focus",a,!0)):(window.attachEvent("onBlur",r),document.attachEvent("onFocus",a))},t.teardownScopedFocus=function(){l=null,window.addEventListener?(window.removeEventListener("blur",r),document.removeEventListener("focus",a)):(window.detachEvent("onBlur",r),document.detachEvent("onFocus",a))}},119:function(e,t){var n=[];e.exports={add:function(e){n.indexOf(e)===-1&&n.push(e)},remove:function(e){var t=n.indexOf(e);t!==-1&&n.splice(t,1)},count:function(){return n.length}}},120:function(e,t,n){var r=n(72);e.exports=function(e,t){var n=r(e);if(!n.length)return void t.preventDefault();var a=n[t.shiftKey?0:n.length-1],o=a===document.activeElement||e===document.activeElement;if(o){t.preventDefault();var i=n[t.shiftKey?n.length-1:0];i.focus()}}},121:function(e,t,n){e.exports=n(115)},127:function(e,t){e.exports=window.SimpleMDE},152:function(e,t,n){try{(function(){"use strict";function e(e){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_INDEX",promise:function(t){return t.request({url:"/project/"+e+"/workflow"})}})}function r(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_CREATE",promise:function(n){return n.request({url:"/project/"+e+"/workflow",method:"post",data:t})}})}function a(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_UPDATE",promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t.id,method:"put",data:t})}})}function o(e){return{type:"WORKFLOW_SELECT",id:e}}function i(e){return{type:"WORKFLOW_DELETE_NOTIFY",id:e}}function l(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_DELETE",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t,method:"delete"})}})}function s(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_PREVIEW",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t+"/preview"})}})}function u(e,t){return(0,c.asyncFuncCreator)({constant:"WORKFLOW_VIEW_USED",id:t,promise:function(n){return n.request({url:"/project/"+e+"/workflow/"+t+"/used"})}})}Object.defineProperty(t,"__esModule",{value:!0}),t.index=e,t.create=r,t.update=a,t.select=o,t.delNotify=i,t.del=l,t.preview=s,t.viewUsed=u;var c=n(26)}).call(this)}finally{}},178:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n
"),imgFileUrls:imgFileUrls}}},{key:"createLightbox",value:function(e,t,n){var r=this;return _react2.default.createElement(_reactImageLightbox2.default,{mainSrc:t[n],nextSrc:t[(n+1)%t.length],prevSrc:t[(n+t.length-1)%t.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){r.state.inlinePreviewShow[e]=!1,r.setState({inlinePreviewShow:r.state.inlinePreviewShow})},onMovePrevRequest:function(){return r.setState({photoIndex:(n+t.length-1)%t.length})},onMoveNextRequest:function(){return r.setState({photoIndex:(n+1)%t.length})}})}},{key:"previewInlineImg",value:function(e){var t=e.target.id;if(t){var n="",r=-1;0===t.indexOf("inlineimg-")&&(n=t.substring(10,t.lastIndexOf("-")),r=t.substr(t.lastIndexOf("-")+1)-0),this.state.inlinePreviewShow[n]=!0,this.setState({inlinePreviewShow:this.state.inlinePreviewShow,photoIndex:r})}}},{key:"componentDidUpdate",value:function(){var e=this.props.users;_lodash2.default.map(e||[],function(e){return e.nameAndEmail=e.name+"("+e.email+")",e});var t=this;$(".comments-inputor textarea").atwho({at:"@",searchKey:"nameAndEmail",displayTpl:"
"):e.before_value}})),u.default.createElement("td",{width:"38%"},u.default.createElement("div",{style:{whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:f.default.isString(e.after_value)?f.default.escape(e.after_value).replace(/(\r\n)|(\n)/g,"
"):e.after_value}})))}))):u.default.createElement("span",{style:{marginLeft:"5px"}},"创建问题"))}))))}}],[{key:"propTypes",value:{issue_id:s.PropTypes.string,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,indexLoading:s.PropTypes.bool.isRequired,indexHistory:s.PropTypes.func.isRequired,sortHistory:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=g,e.exports=t.default}).call(this)}finally{}},229:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n
"),u.default.createElement(d.Panel,{header:i,key:n,style:{marginBottom:"15px"}},u.default.createElement(d.Table,{condensed:!0,hover:!0,responsive:!0},u.default.createElement("thead",null,u.default.createElement("tr",null,u.default.createElement("th",null,"开始日期"),u.default.createElement("th",null,"耗费时间"),u.default.createElement("th",null,"剩余时间"))),u.default.createElement("tbody",null,u.default.createElement("tr",null,u.default.createElement("td",null,y.unix(t.started_at).format("YYYY/MM/DD HH:mm:ss")),u.default.createElement("td",null,t.spend||"-"),u.default.createElement("td",null,void 0===t.leave_estimate_m?"-":e.m2t(t.leave_estimate_m))))),u.default.createElement("div",{style:{marginLeft:"5px",lineHeight:"24px"}},u.default.createElement("span",{style:{width:"10%","float":"left",fontWeight:"bold"}},"备注:"),u.default.createElement("span",{style:{width:"90%","float":"left",whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:l}})))}))),this.state.addWorklogShow&&u.default.createElement(g,{show:!0,issue:i,close:function(){e.setState({addWorklogShow:!1})},data:this.state.selectedWorklog,loading:w,add:k,edit:E,i18n:n}),this.state.delWorklogShow&&u.default.createElement(v,{show:!0,issue:i,close:function(){e.setState({delWorklogShow:!1})},data:this.state.selectedWorklog,loading:w,del:x,i18n:n}))}}],[{key:"propTypes",value:{i18n:s.PropTypes.object.isRequired,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,permissions:s.PropTypes.array.isRequired,issue:s.PropTypes.object.isRequired,options:s.PropTypes.object.isRequired,original_estimate:s.PropTypes.string,indexLoading:s.PropTypes.bool.isRequired,loading:s.PropTypes.bool.isRequired,indexWorklog:s.PropTypes.func.isRequired,sort:s.PropTypes.string.isRequired,sortWorklog:s.PropTypes.func.isRequired,addWorklog:s.PropTypes.func.isRequired,editWorklog:s.PropTypes.func.isRequired,delWorklog:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=b,e.exports=t.default}).call(this)}finally{}},337:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n
"):"-";n[e.key]=u.default.createElement("span",{style:Ge,dangerouslySetInnerHTML:{__html:l}})}else{if(!t[e.key]&&!h.default.isNumber(t[e.key]))return void(n[e.key]="-");var l="";"sprints"===e.key?l=t.sprints&&t.sprints.length>0?t.sprints.join(","):"-":"SingleUser"===e.type?l=t[e.key].name:"MultiUser"===e.type?l=h.default.map(t[e.key],function(e){return e.name}).join(","):["Select","RadioGroup","SingleVersion"].indexOf(e.type)!==-1?l=h.default.findIndex(e.optionValues||[],{id:t[e.key]})===-1?"-":h.default.find(e.optionValues,{id:t[e.key]}).name:["MultiSelect","CheckboxGroup","MultiVersion"].indexOf(e.type)!==-1?!function(){var n=h.default.isArray(t[e.key])?t[e.key]:t[e.key].split(","),r=[];h.default.forEach(n,function(t){var n=h.default.findIndex(e.optionValues||[],{id:t})!==-1?h.default.find(e.optionValues,{id:t}).name:"";n&&r.push(n)}),l=r.length>0?h.default.uniq(r).join(","):"-"}():l="DatePicker"===e.type?v.unix(t[e.key]).format("YYYY/MM/DD"):"DateTimePicker"===e.type?v.unix(t[e.key]).format("YYYY/MM/DD HH:mm"):t[e.key]+("progress"==e.key?"%":""),n[e.key]=u.default.createElement("span",{style:Ge},l)}}),Je.push(n)});var et={};return s?et.noDataText=u.default.createElement("div",null,u.default.createElement("img",{src:k,className:"loading"})):et.noDataText="暂无数据显示。",et.onRowMouseOver=this.onRowMouseOver.bind(this),u.default.createElement("div",null,u.default.createElement(c.BootstrapTable,{hover:!0,data:Je,bordered:!1,options:et,selectRow:Qe,trClassName:"tr-top",headerStyle:{overflow:"unset"}},u.default.createElement(c.TableHeaderColumn,{dataField:"id",hidden:!0,isKey:!0},"ID"),u.default.createElement(c.TableHeaderColumn,{width:"50",dataField:"type"},u.default.createElement("span",{className:"table-header",onClick:this.orderBy.bind(this,"type"),title:"类型"},u.default.createElement("span",{style:{marginRight:"3px"}},"类型"),"type"===Ke.field&&("desc"===Ke.order?u.default.createElement("i",{className:"fa fa-caret-down"}):u.default.createElement("i",{className:"fa fa-caret-up"})))),u.default.createElement(c.TableHeaderColumn,{dataField:"no",width:"50",title:"NO"},u.default.createElement("span",{className:"table-header",onClick:this.orderBy.bind(this,"no")},u.default.createElement("span",{style:{marginRight:"3px"}},"NO"),"no"===Ke.field&&("desc"===Ke.order?u.default.createElement("i",{className:"fa fa-caret-down"}):u.default.createElement("i",{className:"fa fa-caret-up"})))),u.default.createElement(c.TableHeaderColumn,{dataField:"title"},u.default.createElement("span",{className:"table-header",onClick:this.orderBy.bind(this,"title"),title:"主题"},u.default.createElement("span",{style:{marginRight:"3px"}},"主题"),"title"===Ke.field&&("desc"===Ke.order?u.default.createElement("i",{className:"fa fa-caret-down"}):u.default.createElement("i",{className:"fa fa-caret-up"})))),h.default.map(Ye,function(t,n){return u.default.createElement(c.TableHeaderColumn,{width:t.width||"100",dataField:t.key,key:n},u.default.createElement("span",{className:"table-header",onClick:t.sortKey?e.orderBy.bind(e,t.sortKey):null,title:t.name},u.default.createElement("span",{style:{marginRight:"3px"}},t.name),Ke.field===t.sortKey&&("desc"===Ke.order?u.default.createElement("i",{className:"fa fa-caret-down"}):u.default.createElement("i",{className:"fa fa-caret-up"}))))}),u.default.createElement(c.TableHeaderColumn,{width:"60",dataField:"operation"})),this.state.detailBarShow&&u.default.createElement(w,{i18n:n,layout:r,create:D,edit:A,del:N,setAssignee:B,setItemValue:W,setLabels:H,addLabels:z,close:this.closeDetail,options:y,data:i,record:F,forward:I,visitedIndex:L,visitedCollection:q,issueCollection:a,show:g,itemLoading:f,loading:l,fileLoading:Z,project:G,delFile:Y,addFile:K,wfCollection:X,wfLoading:$,viewWorkflow:Q,indexComments:J,sortComments:ee,commentsCollection:te,commentsIndexLoading:ne,commentsLoading:re,commentsItemLoading:se,commentsLoaded:ae,addComments:oe,editComments:ie,delComments:le,indexWorklog:ue,worklogSort:ce,sortWorklog:de,worklogCollection:pe,worklogIndexLoading:fe,worklogLoading:he,worklogLoaded:me,addWorklog:ye,editWorklog:ge,delWorklog:ve,indexHistory:be,sortHistory:we,historyCollection:ke,historyIndexLoading:Ee,historyLoaded:xe,indexGitCommits:_e,sortGitCommits:Ce,gitCommitsCollection:Se,gitCommitsIndexLoading:Te,gitCommitsLoaded:Pe,linkLoading:Me,createLink:Oe,delLink:Re,watch:je,copy:Fe,move:Ie,convert:Le,resetState:qe,doAction:De,user:Be}),!s&&y.total&&y.total>0?u.default.createElement(E,{total:y.total||0,curPage:V.page?V.page-0:1,sizePerPage:y.sizePerPage||50,paginationSize:4,query:V,refresh:U}):"",this.state.delNotifyShow&&u.default.createElement(b,{show:!0,close:this.delNotifyClose,data:Ve,loading:f,del:N,i18n:n}),this.state.addWorklogShow&&u.default.createElement(x,{show:!0,issue:Ve,close:function(){e.setState({addWorklogShow:!1})},loading:he,add:ye,i18n:n}),this.state.editModalShow&&u.default.createElement(_,{show:!0,close:function(){e.setState({editModalShow:!1})},options:y,addLabels:z,loading:l,project:G,edit:A,isSubtask:Ve.parent_id&&!0,data:Ve,i18n:n}),this.state.createSubtaskModalShow&&u.default.createElement(_,{show:!0,close:function(){e.setState({createSubtaskModalShow:!1})},options:y,create:D,loading:l,project:G,parent:Ve,isSubtask:!0,i18n:n}),this.state.convertTypeModalShow&&u.default.createElement(C,{show:!0,close:function(){e.setState({convertTypeModalShow:!1})},options:y,convert:Le,loading:l,issue:Ve,i18n:n}),this.state.convertType2ModalShow&&u.default.createElement(S,{show:!0,close:function(){e.setState({convertType2ModalShow:!1})},options:y,project:G,convert:Le,loading:l,issue:Ve,i18n:n}),this.state.moveModalShow&&u.default.createElement(T,{show:!0,close:function(){e.setState({moveModalShow:!1})},options:y,project:G,move:Ie,loading:l,issue:Ve,i18n:n}),this.state.assignModalShow&&u.default.createElement(P,{show:!0,close:function(){e.setState({assignModalShow:!1})},options:y,setAssignee:B,issue:Ve,i18n:n}),this.state.setLabelsModalShow&&u.default.createElement(O,{show:!0,close:function(){e.setState({setLabelsModalShow:!1})},options:y,setLabels:H,addLabels:z,issue:Ve,i18n:n}),this.state.shareModalShow&&u.default.createElement(R,{show:!0,close:function(){e.setState({shareModalShow:!1})},project:G,issue:Ve}),this.state.resetModalShow&&u.default.createElement(M,{show:!0,close:function(){e.setState({resetModalShow:!1})},options:y,resetState:qe,issue:Ve,i18n:n}),this.state.copyModalShow&&u.default.createElement(j,{show:!0,close:function(){e.setState({copyModalShow:!1})},options:y,loading:l,copy:Fe,data:Ve,i18n:n}))}}],[{key:"propTypes",value:{i18n:s.PropTypes.object.isRequired,layout:s.PropTypes.object.isRequired,collection:s.PropTypes.array.isRequired,wfCollection:s.PropTypes.array.isRequired,wfLoading:s.PropTypes.bool.isRequired,viewWorkflow:s.PropTypes.func.isRequired,indexComments:s.PropTypes.func.isRequired,sortComments:s.PropTypes.func.isRequired,addComments:s.PropTypes.func.isRequired,editComments:s.PropTypes.func.isRequired,delComments:s.PropTypes.func.isRequired,commentsCollection:s.PropTypes.array.isRequired,commentsIndexLoading:s.PropTypes.bool.isRequired,commentsLoading:s.PropTypes.bool.isRequired,commentsItemLoading:s.PropTypes.bool.isRequired,commentsLoaded:s.PropTypes.bool.isRequired,indexWorklog:s.PropTypes.func.isRequired,worklogSort:s.PropTypes.string.isRequired,sortWorklog:s.PropTypes.func.isRequired,addWorklog:s.PropTypes.func.isRequired,editWorklog:s.PropTypes.func.isRequired,delWorklog:s.PropTypes.func.isRequired,worklogCollection:s.PropTypes.array.isRequired,worklogIndexLoading:s.PropTypes.bool.isRequired,worklogLoading:s.PropTypes.bool.isRequired,worklogLoaded:s.PropTypes.bool.isRequired,indexHistory:s.PropTypes.func.isRequired,sortHistory:s.PropTypes.func.isRequired,historyCollection:s.PropTypes.array.isRequired,historyIndexLoading:s.PropTypes.bool.isRequired,historyLoaded:s.PropTypes.bool.isRequired,indexGitCommits:s.PropTypes.func.isRequired,sortGitCommits:s.PropTypes.func.isRequired,gitCommitsCollection:s.PropTypes.array.isRequired,gitCommitsIndexLoading:s.PropTypes.bool.isRequired,gitCommitsLoaded:s.PropTypes.bool.isRequired,itemData:s.PropTypes.object.isRequired,project:s.PropTypes.object,options:s.PropTypes.object,loading:s.PropTypes.bool.isRequired,itemLoading:s.PropTypes.bool.isRequired,indexLoading:s.PropTypes.bool.isRequired,index:s.PropTypes.func.isRequired,refresh:s.PropTypes.func.isRequired,query:s.PropTypes.object,show:s.PropTypes.func.isRequired,edit:s.PropTypes.func.isRequired,create:s.PropTypes.func.isRequired,setAssignee:s.PropTypes.func.isRequired,setItemValue:s.PropTypes.func.isRequired,setLabels:s.PropTypes.func.isRequired,addLabels:s.PropTypes.func.isRequired,fileLoading:s.PropTypes.bool.isRequired,delFile:s.PropTypes.func.isRequired,addFile:s.PropTypes.func.isRequired,record:s.PropTypes.func.isRequired,forward:s.PropTypes.func.isRequired,cleanRecord:s.PropTypes.func.isRequired,visitedIndex:s.PropTypes.number.isRequired,visitedCollection:s.PropTypes.array.isRequired,createLink:s.PropTypes.func.isRequired,delLink:s.PropTypes.func.isRequired,linkLoading:s.PropTypes.bool.isRequired,doAction:s.PropTypes.func.isRequired,watch:s.PropTypes.func.isRequired,copy:s.PropTypes.func.isRequired,move:s.PropTypes.func.isRequired,convert:s.PropTypes.func.isRequired,resetState:s.PropTypes.func.isRequired,del:s.PropTypes.func.isRequired,selectedIds:s.PropTypes.array.isRequired,setSelectedIds:s.PropTypes.func.isRequired,isBatchHandle:s.PropTypes.bool.isRequired,user:s.PropTypes.object.isRequired},enumerable:!0}]),t}(s.Component);t.default=F,e.exports=t.default}).call(this)}finally{}},1866:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n
"+a(p.message+"",!0)+"";throw p}}var d={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:s,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:s,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:s,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};d.bullet=/(?:[*+-]|\d+\.)/,d.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,d.item=l(d.item,"gm")(/bull/g,d.bullet)(),d.list=l(d.list)(/bull/g,d.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+d.def.source+")")(),d.blockquote=l(d.blockquote)("def",d.def)(),d._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",d.html=l(d.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/
1&&l.length>1||(e=a.slice(c+1).join("\n")+e,c=p-1)),o=r||/\n\n(?!\s*$)/.test(s),c!==p-1&&(r="\n"===s.charAt(s.length-1),o||(o=r)),this.tokens.push({type:o?"loose_item_start":"list_item_start"}),this.token(s,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(a=this.rules.html.exec(e))e=e.substring(a[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===a[1]||"script"===a[1]||"style"===a[1]),text:a[0]});else if(!n&&t&&(a=this.rules.def.exec(e)))e=e.substring(a[0].length),this.tokens.links[a[1].toLowerCase()]={href:a[2],title:a[3]};else if(t&&(a=this.rules.table.exec(e))){for(e=e.substring(a[0].length),s={type:"table",header:a[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:a[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:a[3].replace(/(?: *\| *)?\n$/,"").split("\n")},c=0;c "+e+"
\n":"'+(n?e:a(e,!0))+"\n
"},r.prototype.blockquote=function(e){return""+(n?e:a(e,!0))+"\n\n"+e+"
\n"},r.prototype.html=function(e){return e},r.prototype.heading=function(e,t,n){return"
\n":"
\n"},r.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+""+n+">\n"},r.prototype.listitem=function(e){return"\n\n"+e+"\n\n"+t+"\n
\n"},r.prototype.tablerow=function(e){return"\n"+e+" \n"},r.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+""+n+">\n"},r.prototype.strong=function(e){return""+e+""},r.prototype.em=function(e){return""+e+""},r.prototype.codespan=function(e){return""+e+""},r.prototype.br=function(){return this.options.xhtml?"
":"
"},r.prototype.del=function(e){return""+e+""},r.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(o){return""}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:"))return""}var a='"+n+""},r.prototype.image=function(e,t,n){var r='":">"},r.prototype.text=function(e){return e},o.parse=function(e,t,n){var r=new o(t,n);return r.parse(e)},o.prototype.parse=function(e){this.inline=new n(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},o.prototype.next=function(){return this.token=this.tokens.pop()},o.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},o.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},o.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,o,a="",i="";for(n="",e=0;e
'),r.push(i)}}),t=t.replace(/<\/div>(\s*?)
"),imgFiles:r}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void c.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var r=-1;0===n.indexOf("inlineimg-")&&(r=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:r}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,r=t.onEdit,o=t.fieldKey,a=t.value,i=void 0===a?"":a,l=this.state,u=l.inlinePreviewShow,c=l.photoIndex,d=this.extractImg(o,i),p=d.html,f=d.imgFiles;return s.default.createElement("div",{className:"issue-text-field"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){r&&r()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:p||'未设置'}}),u&&s.default.createElement(m.default,{mainSrc:f[c],nextSrc:f[(c+1)%f.length],prevSrc:f[(c+f.length-1)%f.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(c+f.length-1)%f.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(c+1)%f.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={MultiRowsTextEditor:y,MultiRowsTextReader:g}}).call(this)}finally{}},106:function(e,t,n){try{(function(){"use strict";function t(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=function(){function e(e,t){for(var n=0;n$');if(a.exec(t)){var i=RegExp.$1;if(!i)return;n=n.replace(t,'
'),o.push(i)}}),{html:n,imgFiles:o}}},{key:"previewInlineImg",value:function(e){var t=this.props.isImgPreviewed;if(!t)return void d.notify.show("权限不足。","error",2e3);var n=e.target.id;if(n){var r=-1;0===n.indexOf("inlineimg-")&&(r=n.substr(n.lastIndexOf("-")+1)-0,this.setState({inlinePreviewShow:!0,photoIndex:r}))}}},{key:"render",value:function(){var e=this,t=this.props,n=t.isEditable,r=t.onEdit,o=t.fieldKey,a=t.value,i=this.state,l=i.inlinePreviewShow,u=i.photoIndex,c=this.extractImg(o,a||""),d=c.html,p=c.imgFiles;return s.default.createElement("div",{className:"issue-text-field markdown-body"},n&&s.default.createElement("div",{className:"edit-button",onClick:function(){r&&r()}},s.default.createElement("i",{className:"fa fa-pencil"})),s.default.createElement("div",{onClick:this.previewInlineImg.bind(this),dangerouslySetInnerHTML:{__html:d||'未设置'}}),l&&s.default.createElement(f.default,{mainSrc:p[u],nextSrc:p[(u+1)%p.length],prevSrc:p[(u+p.length-1)%p.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){e.setState({inlinePreviewShow:!1})},onMovePrevRequest:function(){return e.setState({photoIndex:(u+p.length-1)%p.length})},onMoveNextRequest:function(){return e.setState({photoIndex:(u+1)%p.length})}}))}}],[{key:"propTypes",value:{isImgPreviewed:l.PropTypes.bool,isEditable:l.PropTypes.bool,onEdit:l.PropTypes.func,fieldKey:l.PropTypes.string.isRequired,value:l.PropTypes.string.isRequired},enumerable:!0}]),t}(s.default.Component);e.exports={RichTextEditor:g,RichTextReader:b}}).call(this)}finally{}},112:function(e,t,n){var r;!function(){"use strict";var o=!("undefined"==typeof window||!window.document||!window.document.createElement),a={canUseDOM:o,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:o&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:o&&!!window.screen};r=function(){return a}.call(t,n,t,e),!(void 0!==r&&(e.exports=r))}()},114:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n
"),imgFileUrls:imgFileUrls}}},{key:"createLightbox",value:function(e,t,n){var r=this;return _react2.default.createElement(_reactImageLightbox2.default,{mainSrc:t[n],nextSrc:t[(n+1)%t.length],prevSrc:t[(n+t.length-1)%t.length],imageTitle:"",imageCaption:"",onCloseRequest:function(){r.state.inlinePreviewShow[e]=!1,r.setState({inlinePreviewShow:r.state.inlinePreviewShow})},onMovePrevRequest:function(){return r.setState({photoIndex:(n+t.length-1)%t.length})},onMoveNextRequest:function(){return r.setState({photoIndex:(n+1)%t.length})}})}},{key:"previewInlineImg",value:function(e){var t=e.target.id;if(t){var n="",r=-1;0===t.indexOf("inlineimg-")&&(n=t.substring(10,t.lastIndexOf("-")),r=t.substr(t.lastIndexOf("-")+1)-0),this.state.inlinePreviewShow[n]=!0,this.setState({inlinePreviewShow:this.state.inlinePreviewShow,photoIndex:r})}}},{key:"componentDidUpdate",value:function(){var e=this.props.users;_lodash2.default.map(e||[],function(e){return e.nameAndEmail=e.name+"("+e.email+")",e});var t=this;$(".comments-inputor textarea").atwho({at:"@",searchKey:"nameAndEmail",displayTpl:"
"):e.before_value}})),u.default.createElement("td",{width:"38%"},u.default.createElement("div",{style:{whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:f.default.isString(e.after_value)?f.default.escape(e.after_value).replace(/(\r\n)|(\n)/g,"
"):e.after_value}})))}))):u.default.createElement("span",{style:{marginLeft:"5px"}},"创建问题"))}))))}}],[{key:"propTypes",value:{issue_id:s.PropTypes.string,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,indexLoading:s.PropTypes.bool.isRequired,indexHistory:s.PropTypes.func.isRequired,sortHistory:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=g,e.exports=t.default}).call(this)}finally{}},229:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n
"),u.default.createElement(d.Panel,{header:i,key:n,style:{marginBottom:"15px"}},u.default.createElement(d.Table,{condensed:!0,hover:!0,responsive:!0},u.default.createElement("thead",null,u.default.createElement("tr",null,u.default.createElement("th",null,"开始日期"),u.default.createElement("th",null,"耗费时间"),u.default.createElement("th",null,"剩余时间"))),u.default.createElement("tbody",null,u.default.createElement("tr",null,u.default.createElement("td",null,y.unix(t.started_at).format("YYYY/MM/DD HH:mm:ss")),u.default.createElement("td",null,t.spend||"-"),u.default.createElement("td",null,void 0===t.leave_estimate_m?"-":e.m2t(t.leave_estimate_m))))),u.default.createElement("div",{style:{marginLeft:"5px",lineHeight:"24px"}},u.default.createElement("span",{style:{width:"10%","float":"left",fontWeight:"bold"}},"备注:"),u.default.createElement("span",{style:{width:"90%","float":"left",whiteSpace:"pre-wrap",wordWrap:"break-word"},dangerouslySetInnerHTML:{__html:l}})))}))),this.state.addWorklogShow&&u.default.createElement(g,{show:!0,issue:i,close:function(){e.setState({addWorklogShow:!1})},data:this.state.selectedWorklog,loading:w,add:E,edit:k,i18n:n}),this.state.delWorklogShow&&u.default.createElement(b,{show:!0,issue:i,close:function(){e.setState({delWorklogShow:!1})},data:this.state.selectedWorklog,loading:w,del:x,i18n:n}))}}],[{key:"propTypes",value:{i18n:s.PropTypes.object.isRequired,currentTime:s.PropTypes.number.isRequired,currentUser:s.PropTypes.object.isRequired,permissions:s.PropTypes.array.isRequired,issue:s.PropTypes.object.isRequired,options:s.PropTypes.object.isRequired,original_estimate:s.PropTypes.string,indexLoading:s.PropTypes.bool.isRequired,loading:s.PropTypes.bool.isRequired,indexWorklog:s.PropTypes.func.isRequired,sort:s.PropTypes.string.isRequired,sortWorklog:s.PropTypes.func.isRequired,addWorklog:s.PropTypes.func.isRequired,editWorklog:s.PropTypes.func.isRequired,delWorklog:s.PropTypes.func.isRequired,collection:s.PropTypes.array.isRequired},enumerable:!0}]),t}(s.Component);t.default=v,e.exports=t.default}).call(this)}finally{}},1060:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n
")}}))))),u.default.createElement("div",{className:"kanban-header"},u.default.createElement("div",{style:{height:"0px",display:this.state.hideHeader?"block":"none",textAlign:"right"}},u.default.createElement("span",{title:"展示看板头"},u.default.createElement(c.Button,{onClick:this.showHeader.bind(this),style:{marginTop:"-37px"}},u.default.createElement("i",{className:"fa fa-angle-double-down","aria-hidden":"true"})))),u.default.createElement("div",{id:"main-header",style:{height:"49px",display:this.state.hideHeader?"none":"block"}},u.default.createElement("div",{style:{display:"inline-block",fontSize:"19px",marginTop:"5px"}},F&&u.default.createElement("img",{src:x,className:"loading"}),!F&&!m.default.isEmpty(i)&&i.name||"",!F&&m.default.isEmpty(i)&&s.length>0&&u.default.createElement("span",{style:{fontSize:"14px"}},"该看板不存在,请重试或选择其它看板。"),!F&&m.default.isEmpty(i)&&s.length<=0&&u.default.createElement("span",{style:{fontSize:"14px"}},"该项目暂未定义看板,",G.permissions&&G.permissions.indexOf("manage_project")!==-1?u.default.createElement("span",null,"请点击 ",u.default.createElement("a",{href:"#",onClick:function(t){t.preventDefault(),e.setState({createKanbanModalShow:!0})}},"创建看板"),"。"):"请联系项目管理员创建。")),u.default.createElement("div",{style:{"float":"right",display:"inline-block"}},G.permissions&&G.permissions.indexOf("create_issue")!==-1&&!m.default.isEmpty(i)&&("kanban"==i.type&&"issue"===r||"backlog"===r)&&u.default.createElement(c.Button,{style:{marginRight:"10px"},bsStyle:"primary",onClick:function(){e.setState({createIssueModalShow:!0})}},u.default.createElement("i",{className:"fa fa-plus"})," 创建问题"),!m.default.isEmpty(i)&&u.default.createElement(c.ButtonGroup,{style:{marginRight:"10px"}},"kanban"==i.type&&u.default.createElement(c.Button,{style:{backgroundColor:"issue"==r&&"#eee"},onClick:function(){e.changeModel("issue")}},"看板"),"scrum"==i.type&&u.default.createElement(c.Button,{style:{backgroundColor:"epic"==r&&"#eee"},onClick:function(){e.changeModel("epic")}},"Epic"),"scrum"==i.type&&E>0&&u.default.createElement(c.Button,{style:{backgroundColor:"history"==r&&"#eee"},onClick:function(){e.changeModel("history")}},"Sprint 历史"),"scrum"==i.type&&u.default.createElement(c.Button,{style:{backgroundColor:"backlog"==r&&"#eee"},onClick:function(){e.changeModel("backlog")}},"Backlog"),"scrum"==i.type&&u.default.createElement(c.Button,{style:{backgroundColor:"issue"==r&&"#eee"},onClick:function(){e.changeModel("issue")}},"活动Sprint"),u.default.createElement(c.Button,{style:{backgroundColor:"config"==r&&"#eee"},onClick:function(){e.changeModel("config")}},"配置")),s.length>0&&u.default.createElement(c.DropdownButton,{pullRight:!0,title:"列表",onSelect:this.changeKanban.bind(this)},m.default.map(s,function(e,t){return u.default.createElement(c.MenuItem,{key:t,eventKey:e.id},u.default.createElement("div",{style:{display:"inline-block",width:"20px",textAlign:"left"}},i.id===e.id&&u.default.createElement("i",{className:"fa fa-check"})),u.default.createElement("span",null,e.name))}),G.permissions&&G.permissions.indexOf("manage_project")!==-1&&u.default.createElement(c.MenuItem,{divider:!0}),G.permissions&&G.permissions.indexOf("manage_project")!==-1&&u.default.createElement(c.MenuItem,{eventKey:"create"},s.length>0&&u.default.createElement("div",{style:{display:"inline-block",width:"20px"}}),u.default.createElement("span",null,"创建看板"))))),"issue"===r&&!F&&!m.default.isEmpty(i)&&u.default.createElement("div",{style:{height:"45px",borderBottom:"2px solid #f5f5f5",display:this.state.hideHeader?"none":"block"}},"scrum"==i.type&&!m.default.isEmpty($)&&u.default.createElement(c.OverlayTrigger,{trigger:"click",rootClose:!0,placement:"bottom",overlay:Z},u.default.createElement("div",{className:"popover-active-sprint"},u.default.createElement("div",{className:"active-sprint-name",title:$.name||""},$.name||""," ",u.default.createElement("i",{className:"fa fa-caret-down","aria-hidden":"true"})))),u.default.createElement("span",{style:{"float":"left",marginTop:"7px",marginRight:"5px"}},"过滤器:"),u.default.createElement(c.Nav,{bsStyle:"pills",style:{"float":"left",lineHeight:"1.0"},activeKey:o,onSelect:this.handleSelect.bind(this)},u.default.createElement(c.NavItem,{eventKey:"all",href:"#"},"全部"),m.default.map(i.filters||[],function(e,t){return u.default.createElement(c.NavItem,{key:t,eventKey:t,href:"#"},e.name)})),u.default.createElement("span",{style:{"float":"right"},title:"隐藏看板头"},u.default.createElement(c.Button,{onClick:this.hideHeader.bind(this)},u.default.createElement("i",{className:"fa fa-angle-double-up","aria-hidden":"true"}))),"scrum"==i.type&&!m.default.isEmpty($)&&u.default.createElement("span",{style:{"float":"right",marginRight:"10px"},title:"燃尽图"},u.default.createElement(c.Button,{onClick:function(){e.setState({burndownModalShow:!0})}},u.default.createElement("i",{className:"fa fa-line-chart","aria-hidden":"true"})," 燃尽图")),u.default.createElement("span",{style:{"float":"right",marginRight:"10px"},title:"更多过滤"},u.default.createElement(c.Button,{onClick:function(){e.setState({moreFilterModalShow:!0})}},u.default.createElement("i",{className:"fa fa-filter","aria-hidden":"true"})," 更多过滤",m.default.isEmpty(this.state.query)?"":"..."))),"backlog"===r&&!m.default.isEmpty(i)&&u.default.createElement("div",{style:{height:"45px",borderBottom:"2px solid #f5f5f5",display:this.state.hideHeader?"none":"block"}},u.default.createElement("div",{className:"exchange-icon",style:{"float":"left",marginTop:"7px"},onClick:this.changeFilterMode.bind(this),title:"切换至"+("epic"==this.state.backlogFilterMode?"版本":"Epic")},u.default.createElement("i",{className:"fa fa-retweet"})),u.default.createElement("span",{style:{"float":"left",marginTop:"7px",marginRight:"5px"}},"epic"===this.state.backlogFilterMode?"Epic":"版本","过滤:"),"epic"===this.state.backlogFilterMode?u.default.createElement("div",{style:{display:"inline-block","float":"left",width:"28%"}},u.default.createElement(p.default,{simpleValue:!0,options:U,value:"all"==o?null:o,onChange:function(t){e.handleSelectEV(t)},placeholder:"选择Epic"})):u.default.createElement("div",{style:{display:"inline-block","float":"left",width:"28%"}},u.default.createElement(p.default,{simpleValue:!0,options:K,value:"all"==o?null:o,onChange:function(t){e.handleSelectEV(t)},placeholder:"选择版本"})),u.default.createElement("span",{style:{"float":"right"},title:"隐藏看板头"},u.default.createElement(c.Button,{onClick:this.hideHeader.bind(this)},u.default.createElement("i",{className:"fa fa-angle-double-up","aria-hidden":"true"}))),G.permissions&&G.permissions.indexOf("manage_project")!==-1&&u.default.createElement("div",{style:{display:"inline-block","float":"right",marginRight:"10px"}},u.default.createElement(c.Button,{bsStyle:"primary",onClick:d},u.default.createElement("i",{className:"fa fa-plus","aria-hidden":"true"})," 创建Sprint"))),"history"===r&&!m.default.isEmpty(i)&&u.default.createElement("div",{style:{height:"45px",borderBottom:"2px solid #f5f5f5",display:this.state.hideHeader?"none":"block"}},u.default.createElement("div",{className:"exchange-icon",style:{"float":"left",marginTop:"7px"}},"Sprint"),u.default.createElement("div",{style:{display:"inline-block","float":"left",width:"28%"}},u.default.createElement(p.default,{simpleValue:!0,clearable:!1,options:Y,value:"all"==o?E:o,onChange:function(t){e.handleSelectSprint(t)},placeholder:"选择Sprint"})),!m.default.isEmpty(C)&&u.default.createElement(c.OverlayTrigger,{trigger:"click",rootClose:!0,placement:"bottom",overlay:X},u.default.createElement("div",{style:{"float":"left",margin:"7px 10px",cursor:"pointer"}},u.default.createElement("i",{className:"fa fa-info-circle","aria-hidden":"true"}))),u.default.createElement("span",{style:{"float":"right"},title:"隐藏看板头"},u.default.createElement(c.Button,{onClick:this.hideHeader.bind(this)},u.default.createElement("i",{className:"fa fa-angle-double-up","aria-hidden":"true"}))),u.default.createElement("span",{style:{"float":"right",marginRight:"10px"},title:"燃尽图"},u.default.createElement(c.Button,{onClick:function(){e.setState({hisBurndownModalShow:!0})}},u.default.createElement("i",{className:"fa fa-line-chart","aria-hidden":"true"})," 燃尽图"))),"epic"===r&&!m.default.isEmpty(i)&&G.permissions&&G.permissions.indexOf("manage_project")!==-1&&u.default.createElement("div",{style:{height:"45px",display:this.state.hideHeader?"none":"block"}},u.default.createElement("div",{style:{display:"inline-block","float":"left",marginRight:"10px"}},u.default.createElement(c.Button,{disabled:I,onClick:function(){e.setState({createEpicModalShow:!0})}},u.default.createElement("i",{className:"fa fa-plus","aria-hidden":"true"})," 新建Epic")),!I&&u.default.createElement("div",{style:{display:"inline-block","float":"left",marginRight:"10px"}},u.default.createElement(c.Button,{onClick:function(){e.setState({sortCardsModalShow:!0})}},u.default.createElement("i",{className:"fa fa-edit","aria-hidden":"true"})," 编辑顺序"))),this.state.createKanbanModalShow&&u.default.createElement(y,{show:!0,close:this.createKanbanModalClose.bind(this),create:a,"goto":V,kanbans:s,i18n:n}),this.state.createIssueModalShow&&u.default.createElement(h,{show:!0,close:this.createIssueModalClose.bind(this),options:G,create:W,addLabels:z,loading:F,project:H,i18n:n}),this.state.createEpicModalShow&&u.default.createElement(g,{show:!0,close:this.createEpicModalClose.bind(this),create:P,collection:M,i18n:n}),this.state.sortCardsModalShow&&u.default.createElement(b,{show:!0,mode:"Epic",close:this.sortCardsModalClose.bind(this),cards:M,setSort:O,sortLoading:N,i18n:n}),this.state.burndownModalShow&&u.default.createElement(w,{show:!0,getSprintLog:L,loading:B,data:D,close:this.burndownModalClose.bind(this),no:$.no}),this.state.moreFilterModalShow&&u.default.createElement(v,{show:!0,search:this.moreSearch.bind(this),query:this.state.query,options:G,close:this.moreFilterModalClose.bind(this)}),this.state.hisBurndownModalShow&&u.default.createElement(w,{show:!0,getSprintLog:L,loading:B,data:D,close:this.hisBurndownModalClose.bind(this),no:o}))}}],[{key:"propTypes",value:{i18n:s.PropTypes.object.isRequired,changeModel:s.PropTypes.func.isRequired,mode:s.PropTypes.string.isRequired,selectedFilter:s.PropTypes.string.isRequired,create:s.PropTypes.func.isRequired,addLabels:s.PropTypes.func.isRequired,createKanban:s.PropTypes.func.isRequired,getSprint:s.PropTypes.func.isRequired,createSprint:s.PropTypes.func.isRequired,createEpic:s.PropTypes.func.isRequired,setEpicSort:s.PropTypes.func.isRequired,project:s.PropTypes.object,curKanban:s.PropTypes.object,kanbans:s.PropTypes.array,completedSprintNum:s.PropTypes.number,selectedSprint:s.PropTypes.object,sprints:s.PropTypes.array,epics:s.PropTypes.array,versions:s.PropTypes.array,loading:s.PropTypes.bool,epicLoading:s.PropTypes.bool,indexEpicLoading:s.PropTypes.bool,getSprintLog:s.PropTypes.func,sprintLog:s.PropTypes.object,sprintLogLoading:s.PropTypes.bool,"goto":s.PropTypes.func,selectFilter:s.PropTypes.func,index:s.PropTypes.func,options:s.PropTypes.object},enumerable:!0}]),t}(s.Component);t.default=_,e.exports=t.default}).call(this)}finally{}},1879:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n-1&&e%1==0&&e<=p}function f(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function _(e){return!!e&&"object"==typeof e}var p=9007199254740991,m="[object Arguments]",h="[object Function]",y="[object GeneratorFunction]",b="object"==typeof t&&t&&t.Object===Object&&t,v="object"==typeof self&&self&&self.Object===Object&&self,M=b||v||Function("return this")(),g=Object.prototype,L=g.hasOwnProperty,Y=g.toString,k=M.Symbol,D=g.propertyIsEnumerable,w=k?k.isConcatSpreadable:void 0,T=Math.max,E=Array.isArray,j=function(e){return s(function(e){e=r(e,1);var t=e.length,n=t;for(void 0;n--;)if("function"!=typeof e[n])throw new TypeError("Expected a function");return function(){for(var n=0,a=t?e[n].apply(this,arguments):arguments[0];++nl)break;u.push(p)}return c.default.createElement("div",{style:{marginTop:"10px",height:"45px"}},c.default.createElement("div",{className:"col-md-6",style:{textAlign:"left"}},c.default.createElement("span",null,d.default.add((a-1)*o,1),"-",a*o>=n?n:a*o," 共",n,"条 ",l,"页")),c.default.createElement("div",{className:"col-md-6",style:{textAlign:"right"}},l>1&&c.default.createElement("ul",{className:"pagination",style:{margin:"0px"}},a-s>1&&c.default.createElement("li",{key:"first"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,1),title:"首页"},"<<")),a-1>0&&l>1&&c.default.createElement("li",{key:"pre"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,a-1),title:"前页"},"<")),d.default.map(u,function(t,n){return c.default.createElement("li",{key:n,className:t===a?"active":""},c.default.createElement("span",{className:"page-button",onClick:e.goPage.bind(e,t)},t))}),au)break;l.push(f)}return c.default.createElement("div",{style:{marginTop:"10px",height:"45px"}},c.default.createElement("div",{className:"col-md-6",style:{textAlign:"left"}},c.default.createElement("span",null,d.default.add((r-1)*i,1),"-",r*i>=n?n:r*i," 共",n,"条 ",u,"页")),c.default.createElement("div",{className:"col-md-6",style:{textAlign:"right"}},u>1&&c.default.createElement("ul",{className:"pagination",style:{margin:"0px"}},r-s>1&&c.default.createElement("li",{key:"first"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,1),title:"首页"},"<<")),r-1>0&&u>1&&c.default.createElement("li",{key:"pre"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,r-1),title:"前页"},"<")),d.default.map(l,function(t,n){return c.default.createElement("li",{key:n,className:t===r?"active":""},c.default.createElement("span",{className:"page-button",onClick:e.goPage.bind(e,t)},t))}),r1&&c.default.createElement("li",{key:"next"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,d.default.add(r,1)),title:"后页"},">")),u-s>r&&c.default.createElement("li",{key:"last"},c.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,u),title:"尾页"},">>")))))}}],[{key:"propTypes",value:{query:l.PropTypes.object,refresh:l.PropTypes.func,total:l.PropTypes.number.isRequired,curPage:l.PropTypes.number,sizePerPage:l.PropTypes.number,paginationSize:l.PropTypes.number},enumerable:!0}]),t}(l.Component);t.default=f,e.exports=t.default}).call(this)}finally{}},854:function(e,t,n){try{(function(){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;no)break;c.push(f)}return u.default.createElement("div",{style:{marginTop:"10px",height:"45px"}},u.default.createElement("div",{className:"col-md-6",style:{textAlign:"left"}},u.default.createElement("span",null,p.default.add((r-1)*i,1),"-",r*i>=a?a:r*i," 共",a,"条 ",o,"页")),u.default.createElement("div",{className:"col-md-6",style:{textAlign:"right"}},o>1&&u.default.createElement("ul",{className:"pagination",style:{margin:"0px"}},r-s>1&&u.default.createElement("li",{key:"first"},u.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,1),title:"首页"},"<<")),r-1>0&&o>1&&u.default.createElement("li",{key:"pre"},u.default.createElement("span",{className:"page-button",onClick:this.goPage.bind(this,r-1),title:"前页"},"<")),p.default.map(c,function(t,a){return u.default.createElement("li",{key:a,className:t===r?"active":""},u.default.createElement("span",{className:"page-button",onClick:e.goPage.bind(e,t)},t))}),r