Compare commits

..

21 Commits
v1.9.18 ... pro

Author SHA1 Message Date
kuaifan
4c357ef36f fix: 设置任务编辑器最小高度 2026-09-13 00:56:42 +00:00
kuaifan
5801d66371 fix: 调整会员选择器间距样式 2026-09-13 00:56:37 +00:00
kuaifan
e34dc01d22 fix(electron): 修复 macOS 签名钥匙串密码传递 2026-09-10 14:22:57 +00:00
kuaifan
a776a94f70 release: v1.9.36 2026-09-10 13:56:21 +00:00
kuaifan
9e4d74bbdb fix: 调整任务指派记录加载图标样式 2026-09-10 13:43:02 +00:00
kuaifan
2ecd59e03b fix: 调整会员选择器搜索栏间距与部门视图样式 2026-09-10 13:31:39 +00:00
kuaifan
b697e73c6b fix: 优化会员选择器已选成员取消交互 2026-09-10 12:23:05 +00:00
kuaifan
f0b376797c feat: 项目设置改为抽屉展示 2026-09-10 12:05:03 +00:00
kuaifan
ef07f7f8d1 fix: 调整项目菜单归档操作分组 2026-09-10 11:39:53 +00:00
kuaifan
a90d4fb013 chore(docker): 更新应用商店镜像至 0.5.6 2026-09-10 08:55:49 +00:00
kuaifan
4249584a08 feat(dashboard): 应用新版仪表盘设计并适配深色主题 2026-09-10 08:55:02 +00:00
kuaifan
80d4b16921 fix(task): 修复任务详情头部最小高度 2026-09-09 03:33:50 +00:00
kuaifan
48f4d009cc style(project): 调整表格分组筛选图标 2026-09-09 02:45:12 +00:00
kuaifan
519e8dbd54 feat(task): 支持任务流转与部门指派 2026-09-09 02:36:52 +00:00
kuaifan
ffbb45708d feat(project): 支持表格分组配置与悬停筛选菜单
新增到期、排期、逾期与未排期分组,按项目缓存显示选择并至少保留一项。

统一分组复选下拉菜单,接入 Cascader 桌面悬停展开,增加勾选后的滚动定位校正。

升级 view-design-hi 至 4.7.0-81,同步多语言、知识库和回归测试。
2026-09-07 12:08:52 +00:00
kuaifan
a3bfc74159 feat(task): 支持创建任务时右键取消已选人员 2026-09-07 00:45:16 +00:00
kuaifan
10474f481c fix(project): 修复列表新增任务显示空白行 2026-09-04 08:28:09 +00:00
kuaifan
f43977f07e feat(system): 支持自定义登录页品牌 2026-09-04 08:18:03 +00:00
kuaifan
ac43f630d3 fix(task): 支持为未领取任务指定负责人 2026-09-04 06:23:20 +00:00
kuaifan
b05b0874f8 feat(app): support hiding AI interfaces 2026-09-04 06:23:19 +00:00
kuaifan
9dfcdc7b07 fix: 修复 AI 知识库读取权限 2026-08-22 22:15:25 +00:00
229 changed files with 6280 additions and 1534 deletions

View File

@ -1,6 +1,6 @@
--- ---
name: dootask-fix-permission name: dootask-fix-permission
description: 修复 DooTask 整个项目的目录和文件权限:根目录 chmod 755bootstrap/cache、docker、public、storage chown 回调用用户且目录 chmod 775public 文件补充所有用户读权限。用于 Nginx 静态文件 403/Permission denied、install/build EACCES 或可写目录检测失败;优先使用 sudo ./cmd permission赋权不删数据。 description: 修复 DooTask 整个项目的目录和文件权限:根目录 chmod 755bootstrap/cache、docker、public、storage chown 回调用用户且目录 chmod 775public、主程序 AI 知识库与应用知识库补充只读访问权限。用于 Nginx 静态文件 403/Permission denied、AI 知识库无法读取、install/build EACCES 或可写目录检测失败;优先使用 sudo ./cmd permission赋权不删数据。
--- ---
# DooTask 目录权限修复 # DooTask 目录权限修复
@ -12,7 +12,7 @@ description: 修复 DooTask 整个项目的目录和文件权限:根目录 chm
- `./cmd build`vite`EACCES: permission denied, copyfile` - `./cmd build`vite`EACCES: permission denied, copyfile`
- Laravel 运行时写 `storage`/`bootstrap/cache` 失败 - Laravel 运行时写 `storage`/`bootstrap/cache` 失败
对齐 `./cmd permission`/`./cmd install` 的赋权逻辑:项目根目录设为 `755`;四个可写目录做 `chmod 775`(仅目录)+ `chown` 回调用 sudo 的用户;`public` 普通文件用 `a+r` 补充 Nginx 所需读权限。 对齐 `./cmd permission`/`./cmd install` 的赋权逻辑:项目根目录设为 `755`;四个可写目录做 `chmod 775`(仅目录)+ `chown` 回调用 sudo 的用户;`public` 普通文件用 `a+r` 补充 Nginx 所需读权限`resources/ai-kb` 目录用 `a+rx`、文件用 `a+r`;应用包目录沿用 `docker``775` 目录权限,并给用于定位知识库的 `config.yml``ai-kb` 内的 Markdown 补充读权限。上述知识库权限供非 root AI 容器只读访问
## 适用目录 ## 适用目录
@ -22,6 +22,8 @@ bootstrap/cache
docker docker
public # 目录 775普通文件 a+r含真实上传数据 public # 目录 775普通文件 a+r含真实上传数据
storage storage
resources/ai-kb # 目录 a+rx、普通文件 a+rAI 容器只读挂载
docker/appstore/apps # config.yml 与 ai-kb 内的 Markdown 文件 a+r
``` ```
## 核心原则:赋权,不删数据 ## 核心原则:赋权,不删数据
@ -34,7 +36,7 @@ storage
2. 用 `ls -ld .` 检查项目根目录是否缺少组/其他用户的 `x` 穿越权限。 2. 用 `ls -ld .` 检查项目根目录是否缺少组/其他用户的 `x` 穿越权限。
3. 确认可使用 sudo改 root 属主的文件或目录需要 root 权限。 3. 确认可使用 sudo改 root 属主的文件或目录需要 root 权限。
4. 用 `find public -type f ! -perm -004 -print` 检查 Nginx 用户可能无法读取的静态文件。 4. 用 `find public -type f ! -perm -004 -print` 检查 Nginx 用户可能无法读取的静态文件。
5. 默认修复项目根目录、四个可写目录`public` 文件;若用户只想解决 build 的 uploads 报错,可只处理 `public/uploads` 5. 默认修复项目根目录、四个可写目录`public` 文件、主程序知识库和应用知识库只读权限;若用户只想解决 build 的 uploads 报错,可只处理 `public/uploads`
检查通过后,汇报将执行的命令,向用户确认一次再执行。 检查通过后,汇报将执行的命令,向用户确认一次再执行。
@ -60,6 +62,14 @@ find bootstrap/cache docker public storage -type d -exec chmod 775 {} \;
# 4) public 普通文件只补充读权限,保留现有写入/执行位 # 4) public 普通文件只补充读权限,保留现有写入/执行位
find public -type f -exec chmod a+r {} \; find public -type f -exec chmod a+r {} \;
# 5) AI 知识库目录补充读取/穿越权限,文件只补充读权限
find resources/ai-kb -type d -exec chmod a+rx {} \;
find resources/ai-kb -type f -exec chmod a+r {} \;
# 6) 应用知识库依赖 config.yml 定位,当前应用统一使用 ai-kb 目录
find docker/appstore/apps -type f -name "config.yml" -exec chmod a+r {} \;
find docker/appstore/apps -type f -path "*/ai-kb/*" -name "*.md" -exec chmod a+r {} \;
``` ```
只想解决 build 的 uploads 报错时,可只执行: 只想解决 build 的 uploads 报错时,可只执行:
@ -68,7 +78,7 @@ find public -type f -exec chmod a+r {} \;
sudo chown -R "$(id -u):$(id -g)" public/uploads sudo chown -R "$(id -u):$(id -g)" public/uploads
``` ```
执行后用 `ls -ld . bootstrap/cache docker public storage` 抽查目录,并用 `find public -type f ! -perm -004 -print` 确认不再有缺少 others 读权限的静态文件。然后重试之前失败的静态文件访问、install/build/update。 执行后用 `ls -ld . bootstrap/cache docker public storage resources/ai-kb` 抽查目录,并用 `find public resources/ai-kb -type f ! -perm -004 -print``find docker/appstore/apps -type f -name "config.yml" ! -perm -004 -print``find docker/appstore/apps -type f -path "*/ai-kb/*" -name "*.md" ! -perm -004 -print` 确认不再有缺少 others 读权限的文件。然后重试之前失败的静态文件访问、AI 知识库检索或 install/build/update。
## 失败处理 ## 失败处理

View File

@ -2,6 +2,25 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [1.9.36]
### Features
- 新增任务流转与部门指派:管理员开启后,可查看负责人交接及任务状态变化记录,指派负责人时附带留言;支持配置部门负责人和部门管理员的指派范围。
- 仪表盘焕新,个人任务列表与四象限展示更清晰,并适配深色主题;团队优先级以环形图展示,点击即可筛选对应任务。
- 项目表格支持按到期、排期、逾期和未排期等分组选择显示内容,并记住各项目的选择;筛选菜单支持鼠标悬停展开。
- 登录页支持自定义 Logo 和系统名称,网页、桌面端与移动端统一展示配置的品牌。
- 项目设置改为右侧抽屉,窄屏下全屏展示,保存和取消按钮固定在底部,长表单操作更方便。
- 创建任务时支持右键取消已选负责人和协助人员;人员选择弹窗支持通过头像关闭按钮或退格键取消选择,并改善触屏操作与部门列表布局。
- 支持由部署管理员单独隐藏移动 APP 的 AI 相关入口,不影响网页和桌面端使用。
### Bug Fixes
- 修复未领取任务缺少指定负责人入口的问题,有权限的成员可通过任务详情的「添加」菜单设置负责人。
- 修复项目列表新增任务时出现空白行的问题。
- 修复知识库读取权限不足可能影响 AI 助手使用产品及应用知识的问题。
- 优化任务详情头部高度、流转记录加载图标及项目归档菜单分组,改善页面显示与操作体验。
## [1.9.18] ## [1.9.18]
### Features ### Features

View File

@ -0,0 +1,91 @@
<?php
namespace App\Http\Controllers\Api;
use App\Exceptions\ApiException;
use App\Models\ProjectTaskHandoff;
use App\Models\User;
use App\Module\Base;
use App\Module\ProjectTaskHandoffService;
use Request;
/**
* @apiDefine projecttaskhandoff 任务流转
*/
class ProjectTaskHandoffController extends AbstractController
{
/**
* @api {get} api/projecttaskhandoff/lists 任务流转记录
* @apiGroup projecttaskhandoff
* @apiParam {Number} task_id 任务ID
* @apiParam {Number} [before_id] 上一页最后一条记录ID
* @apiParam {String} [department_owner_ids] 所选管理部门ID
*/
public function lists()
{
User::auth();
$task = ProjectTaskHandoffService::task((int)Request::input('task_id'));
$query = ProjectTaskHandoff::where('task_id', $task->id);
$beforeId = (int)Request::input('before_id');
if ($beforeId > 0) {
$query->where('id', '<', $beforeId);
}
$rows = $query->orderByDesc('id')->limit(21)->get();
try {
ProjectTaskHandoffService::policy($task);
$canAssign = true;
} catch (ApiException $e) {
$canAssign = false;
}
return Base::retSuccess('success', [
'lists' => $rows->take(20)->values(),
'has_more' => $rows->count() > 20,
'can_assign' => $canAssign,
]);
}
/**
* @api {get} api/projecttaskhandoff/options 任务指派人员与权限
* @apiGroup projecttaskhandoff
* @apiParam {Number} task_id 任务ID
* @apiParam {String} [department_owner_ids] 所选管理部门ID
*/
public function options()
{
User::auth();
$task = ProjectTaskHandoffService::task((int)Request::input('task_id'));
return Base::retSuccess('success', ProjectTaskHandoffService::options($task));
}
/**
* @api {post} api/projecttaskhandoff/assign 指派任务负责人并附带留言
* @apiGroup projecttaskhandoff
* @apiParam {Number} task_id 任务ID
* @apiParam {Array} owners 完整的目标负责人ID列表包含受保护的负责人
* @apiParam {String} version options接口返回的并发校验值
* @apiParam {String} [note] 指派留言最多1000字
* @apiParam {String} [department_owner_ids] 所选管理部门ID
*/
public function assign()
{
User::auth();
$owners = Request::input('owners', []);
$note = Request::input('note') ?? '';
$version = Request::input('version');
if (!Request::isMethod('post')
|| !is_array($owners)
|| count($owners) > 10
|| !is_string($note)
|| mb_strlen($note) > 1000
|| !is_string($version)) {
return Base::retError('指派参数无效');
}
foreach ($owners as $id) {
if ((!is_int($id) && !is_string($id)) || !ctype_digit((string)$id) || (int)$id <= 0) {
return Base::retError('指派参数无效');
}
}
$task = ProjectTaskHandoffService::task((int)Request::input('task_id'));
return Base::retSuccess('指派成功', ProjectTaskHandoffService::assign($task, $owners, $version, trim($note)));
}
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Module\ProjectTaskHandoffSettings;
use App\Models\UserDevice; use App\Models\UserDevice;
use App\Models\WebSocketDialog; use App\Models\WebSocketDialog;
use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsg;
@ -45,7 +46,7 @@ class SystemController extends AbstractController
* @apiParam {String} type * @apiParam {String} type
* - get: 获取(默认) * - get: 获取(默认)
* - all: 获取所有(需要管理员权限) * - all: 获取所有(需要管理员权限)
* - save: 保存设置(参数:['reg', 'reg_identity', 'reg_invite', 'temp_account_alias', 'login_code', 'password_policy', 'project_invite', 'chat_information', 'anon_message', 'convert_video', 'compress_video', 'e2e_message', 'auto_archived', 'archived_day', 'task_visible', 'task_default_time', 'task_user_limit', 'all_group_mute', 'all_group_autoin', 'user_private_chat_mute', 'user_group_chat_mute', 'system_alias', 'system_welcome', 'image_compress', 'image_quality', 'image_save_local'] * - save: 保存设置(参数:['reg', 'reg_identity', 'reg_invite', 'temp_account_alias', 'login_code', 'password_policy', 'project_invite', 'chat_information', 'anon_message', 'convert_video', 'compress_video', 'e2e_message', 'auto_archived', 'archived_day', 'task_visible', 'task_default_time', 'task_user_limit', 'all_group_mute', 'all_group_autoin', 'user_private_chat_mute', 'user_group_chat_mute', 'system_alias', 'login_logo', 'system_welcome', 'image_compress', 'image_quality', 'image_save_local']
* @apiSuccess {Number} ret 返回状态码1正确、0错误 * @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {String} msg 返回信息(错误描述)
@ -61,6 +62,11 @@ class SystemController extends AbstractController
Base::checkClientVersion('0.41.11'); Base::checkClientVersion('0.41.11');
User::auth('admin'); User::auth('admin');
$all = Request::input(); $all = Request::input();
foreach (ProjectTaskHandoffSettings::OPTIONS as $key => $options) {
if (array_key_exists($key, $all) && !in_array($all[$key], $options, true)) {
return Base::retError('流转设置选项无效');
}
}
foreach ($all AS $key => $value) { foreach ($all AS $key => $value) {
if (!in_array($key, [ if (!in_array($key, [
'reg', 'reg',
@ -89,6 +95,7 @@ class SystemController extends AbstractController
'user_private_chat_mute', 'user_private_chat_mute',
'user_group_chat_mute', 'user_group_chat_mute',
'system_alias', 'system_alias',
'login_logo',
'system_welcome', 'system_welcome',
'image_compress', 'image_compress',
'image_quality', 'image_quality',
@ -98,6 +105,11 @@ class SystemController extends AbstractController
'unclaimed_task_reminder_time', 'unclaimed_task_reminder_time',
'task_ai_auto_analyze', 'task_ai_auto_analyze',
'department_owner_project_view', 'department_owner_project_view',
'project_task_handoff',
'project_task_handoff_role',
'project_task_handoff_candidates',
'project_task_handoff_adjust',
'project_task_handoff_note',
'todo_set_permission', 'todo_set_permission',
])) { ])) {
unset($all[$key]); unset($all[$key]);
@ -114,6 +126,10 @@ class SystemController extends AbstractController
if ($all['system_alias'] == config('app.name')) { if ($all['system_alias'] == config('app.name')) {
$all['system_alias'] = ''; $all['system_alias'] = '';
} }
if (isset($all['login_logo'])) {
$loginLogo = $all['login_logo'];
$all['login_logo'] = $loginLogo ? Base::unFillUrl(is_array($loginLogo) ? $loginLogo[0]['path'] : $loginLogo) : '';
}
if ($all['system_welcome'] == '欢迎您,{username}') { if ($all['system_welcome'] == '欢迎您,{username}') {
$all['system_welcome'] = ''; $all['system_welcome'] = '';
} }
@ -130,6 +146,7 @@ class SystemController extends AbstractController
} }
// //
$setting['system_alias'] = ($setting['system_alias'] ?? '') ?: config('app.name'); $setting['system_alias'] = ($setting['system_alias'] ?? '') ?: config('app.name');
$setting['login_logo'] = Base::fillUrl($setting['login_logo'] ?? '');
$setting['reg'] = $setting['reg'] ?: 'open'; $setting['reg'] = $setting['reg'] ?: 'open';
$setting['reg_identity'] = $setting['reg_identity'] ?: 'normal'; $setting['reg_identity'] = $setting['reg_identity'] ?: 'normal';
$setting['temp_account_alias'] = $setting['temp_account_alias'] ?: ''; $setting['temp_account_alias'] = $setting['temp_account_alias'] ?: '';
@ -156,6 +173,8 @@ class SystemController extends AbstractController
$setting['unclaimed_task_reminder_time'] = $setting['unclaimed_task_reminder_time'] ?: ''; $setting['unclaimed_task_reminder_time'] = $setting['unclaimed_task_reminder_time'] ?: '';
$setting['task_ai_auto_analyze'] = $setting['task_ai_auto_analyze'] ?: 'open'; $setting['task_ai_auto_analyze'] = $setting['task_ai_auto_analyze'] ?: 'open';
$setting['department_owner_project_view'] = $setting['department_owner_project_view'] ?: 'open'; $setting['department_owner_project_view'] = $setting['department_owner_project_view'] ?: 'open';
$setting = ProjectTaskHandoffSettings::normalize($setting);
$setting['app_ai_hidden'] = config('dootask.app_ai_hidden');
$setting['server_timezone'] = config('app.timezone'); $setting['server_timezone'] = config('app.timezone');
$setting['server_version'] = Base::getVersion(); $setting['server_version'] = Base::getVersion();
// 指定人员名单仅管理员可见 // 指定人员名单仅管理员可见

View File

@ -75,6 +75,7 @@ class IndexController extends InvokeController
} }
return response()->view('main', [ return response()->view('main', [
'system_alias' => Base::settingFind('system', 'system_alias', 'WebPage'), 'system_alias' => Base::settingFind('system', 'system_alias', 'WebPage'),
'login_logo' => Base::fillUrl(Base::settingFind('system', 'login_logo')),
'version' => Base::getVersion(), 'version' => Base::getVersion(),
'style' => $style, 'style' => $style,
'script' => $script, 'script' => $script,

View File

@ -2,6 +2,7 @@
namespace App\Models; namespace App\Models;
use App\Module\ProjectTaskHandoffRecord;
use App\Module\Timer; use App\Module\Timer;
use DB; use DB;
use Arr; use Arr;
@ -631,6 +632,7 @@ class ProjectTask extends AbstractModel
} }
} }
$task->addLog("创建{任务}"); $task->addLog("创建{任务}");
ProjectTaskHandoffRecord::created($task);
return $task; return $task;
}); });
} }
@ -648,7 +650,7 @@ class ProjectTask extends AbstractModel
public function updateTask($data, &$updateMarking = []) public function updateTask($data, &$updateMarking = [])
{ {
// //
AbstractModel::transaction(function () use ($data, &$updateMarking) { ProjectTaskHandoffRecord::track($this, isset($data['flow_item_id']) ? 'flow' : 'update', function () use ($data, &$updateMarking) {
// 主任务 // 主任务
$mainTask = $this->parent_id > 0 ? self::find($this->parent_id) : null; $mainTask = $this->parent_id > 0 ? self::find($this->parent_id) : null;
// 工作流 // 工作流
@ -1267,6 +1269,7 @@ class ProjectTask extends AbstractModel
$tmp->save(); $tmp->save();
} }
// //
ProjectTaskHandoffRecord::created($task, 'copy');
return $task; return $task;
}); });
} }
@ -1600,7 +1603,7 @@ class ProjectTask extends AbstractModel
*/ */
public function completeTask($complete_at, $complete_name = null) public function completeTask($complete_at, $complete_name = null)
{ {
AbstractModel::transaction(function () use ($complete_at, $complete_name) { ProjectTaskHandoffRecord::track($this, 'complete', function () use ($complete_at, $complete_name) {
$addMsg = $this->parent_id == 0 && $this->dialog_id > 0; $addMsg = $this->parent_id == 0 && $this->dialog_id > 0;
if ($complete_at === null) { if ($complete_at === null) {
// 标记未完成 // 标记未完成
@ -1672,7 +1675,7 @@ class ProjectTask extends AbstractModel
} }
throw new ApiException('仅限【' . $flowItems . '】状态的任务归档'); throw new ApiException('仅限【' . $flowItems . '】状态的任务归档');
} }
AbstractModel::transaction(function () use ($isAuto, $archived_at) { ProjectTaskHandoffRecord::track($this, $isAuto ? 'auto_archive' : 'archive', function () use ($isAuto, $archived_at) {
if ($archived_at === null) { if ($archived_at === null) {
// 还原任务栏 // 还原任务栏
if (!$this->projectColumn) { if (!$this->projectColumn) {
@ -2123,7 +2126,7 @@ class ProjectTask extends AbstractModel
*/ */
public function moveTask(int $projectId, int $columnId, int $flowItemId = 0, array $owner = [], array $assist = [], ?string $completed = null) public function moveTask(int $projectId, int $columnId, int $flowItemId = 0, array $owner = [], array $assist = [], ?string $completed = null)
{ {
AbstractModel::transaction(function () use ($projectId, $columnId, $flowItemId, $owner, $assist, $completed) { ProjectTaskHandoffRecord::track($this, 'move', function () use ($projectId, $columnId, $flowItemId, $owner, $assist, $completed) {
$newTaskUser = array_merge($owner, $assist); $newTaskUser = array_merge($owner, $assist);
// //
$oldProject = Project::find($this->project_id); $oldProject = Project::find($this->project_id);

View File

@ -0,0 +1,12 @@
<?php
namespace App\Models;
class ProjectTaskHandoff extends AbstractModel
{
protected $table = 'project_task_handoffs';
protected $casts = [
'record' => 'array',
];
}

View File

@ -2,6 +2,8 @@
namespace App\Models; namespace App\Models;
use App\Module\ProjectTaskHandoffRecord;
/** /**
* App\Models\ProjectTaskUser * App\Models\ProjectTaskUser
* *
@ -56,34 +58,42 @@ class ProjectTaskUser extends AbstractModel
$tastIds = []; $tastIds = [];
/** @var self $item */ /** @var self $item */
foreach ($list as $item) { foreach ($list as $item) {
$row = self::whereTaskId($item->task_id)->whereUserid($newUserid)->first(); $transfer = function () use ($item, $originalUserid, $newUserid, &$tastIds) {
if ($row) { $row = self::whereTaskId($item->task_id)->whereUserid($newUserid)->first();
// 已存在则删除原数据,判断改变已存在的数据 if ($row) {
$row->owner = max($row->owner, $item->owner); // 已存在则删除原数据,判断改变已存在的数据
$row->save(); $row->owner = max($row->owner, $item->owner);
$item->delete(); $row->save();
} else { $item->delete();
// 不存在则改变原数据 } else {
$item->userid = $newUserid; // 不存在则改变原数据
$item->save(); $item->userid = $newUserid;
} $item->save();
if ($item->projectTask) {
$item->projectTask->addLog("移交{任务}身份", [
'change' => [
[
'type' => 'user',
'data' => $originalUserid,
],
[
'type' => 'user',
'data' => $newUserid,
]
],
], 0, 1);
if (!in_array($item->task_pid, $tastIds)) {
$tastIds[] = $item->task_pid;
$item->projectTask->syncDialogUser();
} }
if ($item->projectTask) {
$item->projectTask->addLog("移交{任务}身份", [
'change' => [
[
'type' => 'user',
'data' => $originalUserid,
],
[
'type' => 'user',
'data' => $newUserid,
]
],
], 0, 1);
if (!in_array($item->task_pid, $tastIds)) {
$tastIds[] = $item->task_pid;
$item->projectTask->syncDialogUser();
}
}
};
$task = ProjectTask::withTrashed()->find($item->task_id);
if ($task) {
ProjectTaskHandoffRecord::track($task, 'transfer', $transfer);
} else {
$transfer();
} }
} }
}); });

View File

@ -2,6 +2,7 @@
namespace App\Models; namespace App\Models;
use App\Module\ProjectTaskHandoffRecord;
use App\Module\Base; use App\Module\Base;
/** /**
@ -156,7 +157,13 @@ class ProjectUser extends AbstractModel
$tastIds = []; $tastIds = [];
/** @var ProjectTaskUser $item */ /** @var ProjectTaskUser $item */
foreach ($list as $item) { foreach ($list as $item) {
$item->delete(); if ($item->projectTask) {
ProjectTaskHandoffRecord::track($item->projectTask, 'member_exit', function () use ($item) {
$item->delete();
});
} else {
$item->delete();
}
if (!in_array($item->task_pid, $tastIds)) { if (!in_array($item->task_pid, $tastIds)) {
$tastIds[] = $item->task_pid; $tastIds[] = $item->task_pid;
$item->projectTask?->syncDialogUser(); $item->projectTask?->syncDialogUser();

View File

@ -0,0 +1,106 @@
<?php
namespace App\Module;
use App\Models\AbstractModel;
use App\Models\ProjectTask;
use App\Models\ProjectTaskHandoff;
use App\Models\ProjectTaskUser;
use App\Services\RequestContext;
use Closure;
class ProjectTaskHandoffRecord
{
public const FIELDS = [
'flow_item_id',
'flow_item_name',
'complete_at',
'archived_at',
];
public static function owners(int $taskId): array
{
return ProjectTaskUser::whereTaskId($taskId)
->whereOwner(1)
->orderBy('userid')
->pluck('userid')
->map(fn ($id) => (int)$id)
->all();
}
public static function snapshot(ProjectTask $task): array
{
$state = [];
foreach (self::FIELDS as $field) {
$state[$field] = $task->getRawOriginal($field);
}
$state['owners'] = self::owners($task->id);
return $state;
}
public static function active(int $taskId): bool
{
return (bool)RequestContext::get('project_task_handoff_' . $taskId, false);
}
/**
* 同一请求、同一任务的嵌套状态与负责人变更合并为一条流转记录。
*/
public static function track(ProjectTask $task, string $source, Closure $callback, string $note = '')
{
if (self::active($task->id)) {
return $callback();
}
return AbstractModel::transaction(function () use ($task, $source, $callback, $note) {
$locked = ProjectTask::withTrashed()->whereKey($task->id)->lockForUpdate()->firstOrFail();
$before = self::snapshot($locked);
$task->setRawAttributes($locked->getAttributes(), true);
$task->unsetRelations();
$key = 'project_task_handoff_' . $task->id;
RequestContext::save($key, true);
try {
$result = $callback();
self::write($task->id, $source, $before, self::snapshot($task->fresh()), $note);
return $result;
} finally {
RequestContext::save($key, false);
}
});
}
public static function created(ProjectTask $task, string $source = 'create'): void
{
self::write($task->id, $source, null, self::snapshot($task->fresh()));
}
public static function updated(ProjectTask $task): void
{
if (self::active($task->id) || !$task->isDirty(self::FIELDS)) {
return;
}
$before = self::snapshot($task);
$after = $before;
foreach (self::FIELDS as $field) {
$after[$field] = $task->getAttributes()[$field] ?? null;
}
self::write($task->id, 'update', $before, $after);
}
public static function write(int $taskId, string $source, ?array $before, array $after, string $note = ''): void
{
if ($before === $after) {
return;
}
$event = ProjectTaskHandoff::createInstance([
'task_id' => $taskId,
'userid' => Doo::userId(),
'source' => $source,
]);
$event->record = [
'before' => $before,
'after' => $after,
'note' => $note,
];
$event->save();
}
}

View File

@ -0,0 +1,209 @@
<?php
namespace App\Module;
use App\Exceptions\ApiException;
use App\Models\Project;
use App\Models\ProjectPermission;
use App\Models\ProjectTask;
use App\Models\ProjectTaskHandoff;
use App\Models\ProjectTaskUser;
use App\Models\ProjectTaskVisibilityUser;
use App\Models\ProjectUser;
use App\Models\User;
use App\Models\UserDepartment;
class ProjectTaskHandoffService
{
/**
* 按任务详情的可见范围获取任务。
*/
public static function task(int $taskId): ProjectTask
{
if (ProjectTaskHandoffSettings::get()['project_task_handoff'] !== 'open') {
throw new ApiException('任务流转未开启');
}
$task = ProjectTask::findForDepartmentView($taskId, null);
$userid = Doo::userId();
// 私密任务还需校验任务身份,不能仅凭项目成员身份访问。
if ((int)$task->visibility !== 1) {
$projectOwner = ProjectUser::whereProjectId($task->project_id)->whereUserid($userid)
->whereIn('owner', [ProjectUser::OWNER_PRIMARY, ProjectUser::OWNER_DEPUTY])->exists();
$participant = ProjectTaskUser::whereUserid($userid)->where(function ($query) use ($taskId) {
$query->where('task_id', $taskId)->orWhere('task_pid', $taskId);
})->exists();
if (!$projectOwner && !$participant && !ProjectTaskVisibilityUser::whereTaskId($taskId)->whereUserid($userid)->exists()) {
throw new ApiException('无任务权限');
}
}
return $task;
}
/**
* 校验指派权限,计算候选人员和不可移除的负责人。
*/
public static function policy(ProjectTask $task): array
{
$settings = ProjectTaskHandoffSettings::get();
$project = Project::find($task->project_id);
if ($settings['project_task_handoff'] !== 'open' || !$project || $project->archived_at || $task->archived_at) {
throw new ApiException('当前任务不可指派');
}
$userid = Doo::userId();
$owners = ProjectTaskHandoffRecord::owners($task->id);
$members = ProjectUser::whereProjectId($task->project_id)
->pluck('userid')
->map(fn ($id) => (int)$id)
->all();
$ordinary = false;
if (in_array($userid, $members, true)) {
$authProject = Project::userProject($project->id);
if ($owners) {
ProjectPermission::userTaskPermission($authProject, ProjectPermission::TASK_UPDATE, $task);
}
$ordinary = true;
}
$protected = [];
$candidates = $members;
if (!$ordinary) {
$context = UserDepartment::ownerViewContext(User::auth(), true);
if ($settings['project_task_handoff_role'] === 'close'
|| !UserDepartment::isDepartmentReadonlyProject($context, $project->id)
|| (int)$task->visibility !== 1) {
throw new ApiException('无指派权限');
}
$departments = UserDepartment::getManagedDepartments($userid);
if ($settings['project_task_handoff_role'] === 'owner') {
$departments = $departments->where('owner_userid', $userid);
}
$selectedScope = UserDepartment::getManagedDepartmentScopeIds(
$userid,
request()->input('department_owner_ids', request()->input('department_ids'))
);
$roots = $departments->pluck('id')->map(fn ($id) => (int)$id)->all();
$scope = $roots ? array_values(array_intersect(
UserDepartment::getManagedDepartmentScopeIds($userid, $roots),
$selectedScope
)) : [];
if (!$scope) {
throw new ApiException('无指派权限');
}
$managed = User::where(function ($query) use ($scope) {
foreach ($scope as $id) {
$query->orWhere('department', 'like', "%,{$id},%");
}
})->pluck('userid')->map(fn ($id) => (int)$id)->all();
// 项目访问权限必须来自符合指派设置的部门,不能借用其他部门的管理员身份。
if (!array_intersect($managed, $members)) {
throw new ApiException('无指派权限');
}
if ($settings['project_task_handoff_candidates'] === 'department') {
$candidates = array_values(array_intersect($members, $managed));
}
if ($settings['project_task_handoff_adjust'] === 'department') {
$protected = array_values(array_diff($owners, $managed));
}
}
$candidates = User::whereIn('userid', $candidates)
->whereNull('disable_at')
->where('bot', 0)
->pluck('userid')
->map(fn ($id) => (int)$id)
->all();
return [
'owners' => $owners,
'protected' => $protected,
'candidates' => $candidates,
'note_required' => $settings['project_task_handoff_note'] === 'required',
'version' => self::version($task),
];
}
public static function version(ProjectTask $task): string
{
return hash('sha256', json_encode([
$task->project_id,
ProjectTaskHandoffRecord::owners($task->id),
ProjectTaskHandoff::where('task_id', $task->id)->max('id'),
]));
}
public static function options(ProjectTask $task): array
{
$policy = self::policy($task);
$policy['users'] = User::select(['userid', 'email', 'nickname', 'userimg'])
->whereIn('userid', array_unique(array_merge($policy['candidates'], $policy['owners'])))
->orderBy('nickname')
->get()
->makeHidden(['email'])
->toArray();
return $policy;
}
public static function validateOwners(array $owners, array $policy, string $version, string $note): array
{
$owners = array_values(array_unique(array_map('intval', $owners)));
sort($owners);
if (!hash_equals($policy['version'], $version)) {
throw new ApiException('负责人已发生变化,请刷新后重试');
}
if (count($owners) > 10) {
throw new ApiException('任务负责人最多不能超过10个');
}
if (array_diff($policy['protected'], $owners)) {
throw new ApiException('不能移除管理范围外的负责人');
}
$added = array_diff($owners, $policy['owners']);
if (array_diff($added, $policy['candidates'])) {
throw new ApiException('所选负责人不在可指派范围内');
}
if ($owners === $policy['owners']) {
throw new ApiException('负责人未发生变化');
}
if ($policy['note_required'] && $note === '') {
throw new ApiException('请填写指派留言');
}
return $owners;
}
/**
* 在同一事务中更新负责人、记录留言,并复用任务通知。
*/
public static function assign(ProjectTask $task, array $owners, string $version, string $note): array
{
return ProjectTaskHandoffRecord::track($task, 'assign', function () use ($task, $owners, $version, $note) {
$authorized = self::task($task->id);
$policy = self::policy($authorized);
$owners = self::validateOwners($owners, $policy, $version, $note);
$projectMembers = ProjectUser::whereProjectId($task->project_id)->whereIn('userid', $owners)->pluck('userid')->all();
if (array_diff($owners, $projectMembers)) {
throw new ApiException('所选负责人不在可指派范围内');
}
$marking = [];
$task->updateTask(['owner' => $owners], $marking);
$data = ProjectTask::oneTask($task->id)->toArray();
$data['update_marking'] = $marking;
$data['visibility_appointor'] = ProjectTaskVisibilityUser::whereTaskId($task->id)->pluck('userid')->all();
$task->pushMsg('update', $data);
$removed = array_values(array_diff($policy['owners'], $owners));
$visibilityTasks = [$task];
if ($task->parent_id && ($parent = ProjectTask::find($task->parent_id))) {
$visibilityTasks[] = $parent;
}
foreach ($visibilityTasks as $visibleTask) {
if (!$removed || (int)$visibleTask->visibility === 1) {
continue;
}
$remaining = ProjectTaskUser::where(function ($query) use ($visibleTask) {
$query->where('task_id', $visibleTask->id)->orWhere('task_pid', $visibleTask->id);
})->pluck('userid')->all();
$appointed = ProjectTaskVisibilityUser::whereTaskId($visibleTask->id)->pluck('userid')->all();
$lostAccess = array_values(array_diff($removed, $remaining, $appointed));
if ($lostAccess) {
$visibleTask->pushMsgVisibleRemove($lostAccess);
}
}
return $data;
}, $note);
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Module;
class ProjectTaskHandoffSettings
{
// 每项的第一个值为默认值,未配置的旧系统也使用该值。
public const OPTIONS = [
'project_task_handoff' => ['close', 'open'],
'project_task_handoff_role' => ['owner', 'close', 'managers'],
'project_task_handoff_candidates' => ['department', 'project'],
'project_task_handoff_adjust' => ['department', 'all'],
'project_task_handoff_note' => ['optional', 'required'],
];
public static function normalize(array $settings): array
{
foreach (self::OPTIONS as $key => $options) {
if (!in_array($settings[$key] ?? null, $options, true)) {
$settings[$key] = $options[0];
}
}
return $settings;
}
public static function get(): array
{
return self::normalize(Base::setting('system'));
}
}

View File

@ -2,6 +2,7 @@
namespace App\Observers; namespace App\Observers;
use App\Module\ProjectTaskHandoffRecord;
use App\Models\Deleted; use App\Models\Deleted;
use App\Models\ProjectTask; use App\Models\ProjectTask;
use App\Models\ProjectTaskUser; use App\Models\ProjectTaskUser;
@ -30,6 +31,7 @@ class ProjectTaskObserver extends AbstractObserver
*/ */
public function updated(ProjectTask $projectTask) public function updated(ProjectTask $projectTask)
{ {
ProjectTaskHandoffRecord::updated($projectTask);
if ($projectTask->isDirty('visibility')) { if ($projectTask->isDirty('visibility')) {
self::visibilityUpdate($projectTask); self::visibilityUpdate($projectTask);
} }

View File

@ -46,7 +46,7 @@ class RequestContext
// 尝试从当前请求获取 // 尝试从当前请求获取
$request = request(); $request = request();
if ($request && method_exists($request, 'attributes') && $request->attributes) { if ($request && isset($request->attributes)) {
if (!$request->attributes->has(static::CONTEXT_KEY)) { if (!$request->attributes->has(static::CONTEXT_KEY)) {
$request->attributes->set(static::CONTEXT_KEY, self::generateRequestId()); $request->attributes->set(static::CONTEXT_KEY, self::generateRequestId());
} }

View File

@ -2,6 +2,7 @@
namespace App\Tasks; namespace App\Tasks;
use App\Module\ProjectTaskHandoffRecord;
use App\Models\ProjectFlow; use App\Models\ProjectFlow;
use App\Models\ProjectFlowItem; use App\Models\ProjectFlowItem;
use App\Models\ProjectTask; use App\Models\ProjectTask;
@ -35,46 +36,48 @@ class LoopTask extends AbstractTask
} }
try { try {
$task = $item->copyTask(); $task = $item->copyTask();
// 工作流 ProjectTaskHandoffRecord::track($task, 'recurring', function () use ($task, $item) {
$projectFlow = ProjectFlow::whereProjectId($task->project_id)->orderByDesc('id')->first(); // 工作流
if ($projectFlow) { $projectFlow = ProjectFlow::whereProjectId($task->project_id)->orderByDesc('id')->first();
$projectFlowItem = ProjectFlowItem::whereFlowId($projectFlow->id)->orderBy('sort')->get(); if ($projectFlow) {
// 赋一个开始状态 $projectFlowItem = ProjectFlowItem::whereFlowId($projectFlow->id)->orderBy('sort')->get();
foreach ($projectFlowItem as $flowItem) { // 赋一个开始状态
if ($flowItem->status == 'start') { foreach ($projectFlowItem as $flowItem) {
$task->flow_item_id = $flowItem->id; if ($flowItem->status == 'start') {
$task->flow_item_name = $flowItem->status . "|" . $flowItem->name . "|" . $flowItem->color; $task->flow_item_id = $flowItem->id;
if ($flowItem->userids) { $task->flow_item_name = $flowItem->status . "|" . $flowItem->name . "|" . $flowItem->color;
$userids = array_values(array_unique($flowItem->userids)); if ($flowItem->userids) {
foreach ($userids as $uid) { $userids = array_values(array_unique($flowItem->userids));
ProjectTaskUser::updateInsert([ foreach ($userids as $uid) {
'task_id' => $task->id, ProjectTaskUser::updateInsert([
'userid' => $uid, 'task_id' => $task->id,
], [ 'userid' => $uid,
'project_id' => $task->project_id, ], [
'task_pid' => $task->id, 'project_id' => $task->project_id,
'owner' => 1, 'task_pid' => $task->id,
]); 'owner' => 1,
]);
}
} }
break;
} }
break;
} }
} }
} // 新任务时间、周期
// 新任务时间、周期 if ($task->start_at) {
if ($task->start_at) { $diffSecond = (int)Carbon::parse($task->start_at)->diffInSeconds(Carbon::parse($task->end_at), true);
$diffSecond = (int)Carbon::parse($task->start_at)->diffInSeconds(Carbon::parse($task->end_at), true); $task->start_at = Carbon::parse($task->loop_at);
$task->start_at = Carbon::parse($task->loop_at); $task->end_at = $task->start_at->clone()->addSeconds($diffSecond);
$task->end_at = $task->start_at->clone()->addSeconds($diffSecond); }
} // 处理子任务
// 处理子任务 $item->copySubTasks($task, [
$item->copySubTasks($task, [ 'reset_complete' => true,
'reset_complete' => true, 'sync_time' => true,
'sync_time' => true, ]);
]); //
// $task->refreshLoop(true);
$task->refreshLoop(true); $task->addLog("创建任务来自周期任务ID{$item->id}", [], $task->userid);
$task->addLog("创建任务来自周期任务ID{$item->id}", [], $task->userid); });
// 清空旧周期 // 清空旧周期
$item->loop = ''; $item->loop = '';
$item->loop_at = null; $item->loop_at = null;

54
cmd
View File

@ -115,6 +115,14 @@ WORK_DIR="$(pwd)"
INPUT_ARGS=$@ INPUT_ARGS=$@
COMPOSE="docker-compose" COMPOSE="docker-compose"
# 项目运行时需要写入并检查权限的目录
PROJECT_WRITABLE_DIRS=(
"bootstrap/cache"
"docker"
"public"
"storage"
)
# TTY 参数检测 # TTY 参数检测
TTY_FLAG="" TTY_FLAG=""
if [ -t 0 ] && [ -t 1 ]; then if [ -t 0 ] && [ -t 1 ]; then
@ -231,22 +239,19 @@ check_sudo() {
# 修复项目权限 # 修复项目权限
permission_fix() { permission_fix() {
# 确定可写目录的归属用户sudo 执行时恢复为原调用用户。
local owner_uid="${SUDO_UID:-$(id -u)}" local owner_uid="${SUDO_UID:-$(id -u)}"
local owner_gid="${SUDO_GID:-$(id -g)}" local owner_gid="${SUDO_GID:-$(id -g)}"
volumes=(
"bootstrap/cache"
"docker"
"public"
"storage"
)
# 项目根目录需要允许服务进程穿越。
chmod 755 "${WORK_DIR}" chmod 755 "${WORK_DIR}"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
error "$(msg '项目权限修复失败')" error "$(msg '项目权限修复失败')"
exit 1 exit 1
fi fi
for vol in "${volumes[@]}"; do # 可写目录归还给调用用户,并统一补充组写入权限。
for vol in "${PROJECT_WRITABLE_DIRS[@]}"; do
tmp_path="${WORK_DIR}/${vol}" tmp_path="${WORK_DIR}/${vol}"
mkdir -p "${tmp_path}" mkdir -p "${tmp_path}"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
@ -265,11 +270,42 @@ permission_fix() {
fi fi
done done
# public 中的静态文件需要允许 Web 服务读取。
find "${WORK_DIR}/public" -type f -exec chmod a+r {} \; find "${WORK_DIR}/public" -type f -exec chmod a+r {} \;
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
error "$(msg '项目权限修复失败')" error "$(msg '项目权限修复失败')"
exit 1 exit 1
fi fi
# AI 容器以非 root 用户只读挂载主程序知识库。
local kb_path="${WORK_DIR}/resources/ai-kb"
if [[ -d "${kb_path}" ]]; then
find "${kb_path}" -type d -exec chmod a+rx {} \;
if [ $? -ne 0 ]; then
error "$(msg '项目权限修复失败')"
exit 1
fi
find "${kb_path}" -type f -exec chmod a+r {} \;
if [ $? -ne 0 ]; then
error "$(msg '项目权限修复失败')"
exit 1
fi
fi
# 应用知识库由 config.yml 声明并统一放在 ai-kb 目录;不修改应用运行数据文件。
local appstore_apps_path="${WORK_DIR}/docker/appstore/apps"
if [[ -d "${appstore_apps_path}" ]]; then
find "${appstore_apps_path}" -type f -name "config.yml" -exec chmod a+r {} \;
if [ $? -ne 0 ]; then
error "$(msg '项目权限修复失败')"
exit 1
fi
find "${appstore_apps_path}" -type f -path "*/ai-kb/*" -name "*.md" -exec chmod a+r {} \;
if [ $? -ne 0 ]; then
error "$(msg '项目权限修复失败')"
exit 1
fi
fi
} }
# 检查docker、docker-compose # 检查docker、docker-compose
@ -767,7 +803,7 @@ handle_install() {
permission_fix permission_fix
cmda="" cmda=""
cmdb="" cmdb=""
for vol in "${volumes[@]}"; do for vol in "${PROJECT_WRITABLE_DIRS[@]}"; do
tmp_path="${WORK_DIR}/${vol}" tmp_path="${WORK_DIR}/${vol}"
rm -f "${tmp_path}/dootask.lock" rm -f "${tmp_path}/dootask.lock"
cmda="${cmda} -v ${tmp_path}:/usr/share/${vol}" cmda="${cmda} -v ${tmp_path}:/usr/share/${vol}"
@ -784,7 +820,7 @@ handle_install() {
error "$(msg '目录权限检测失败!请检查目录权限设置')" error "$(msg '目录权限检测失败!请检查目录权限设置')"
exit 1 exit 1
fi fi
for vol in "${volumes[@]}"; do for vol in "${PROJECT_WRITABLE_DIRS[@]}"; do
if [ ! -f "${vol}/dootask.lock" ]; then if [ ! -f "${vol}/dootask.lock" ]; then
if [ $remaining -lt 0 ]; then if [ $remaining -lt 0 ]; then
error "$(msg '目录【(*)】权限不足!' "$vol")" error "$(msg '目录【(*)】权限不足!' "$vol")"

View File

@ -8,6 +8,9 @@ return [
// 许可证显示开关:设为 'hidden' 时隐藏系统许可证信息Doo::license // 许可证显示开关:设为 'hidden' 时隐藏系统许可证信息Doo::license
'system_license' => env('SYSTEM_LICENSE'), 'system_license' => env('SYSTEM_LICENSE'),
// 移动 APP AI 界面开关:设为 true 时仅在移动 APP 隐藏 AI 相关界面
'app_ai_hidden' => filter_var(env('APP_AI_HIDDEN', false), FILTER_VALIDATE_BOOLEAN),
// 演示账号登录页展示的演示账号SystemController::demo // 演示账号登录页展示的演示账号SystemController::demo
'demo_account' => env('DEMO_ACCOUNT'), 'demo_account' => env('DEMO_ACCOUNT'),

View File

@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::create('project_task_handoffs', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('task_id');
$table->unsignedInteger('userid')->default(0);
$table->string('source', 32);
$table->json('record');
$table->timestamps();
$table->index(['task_id', 'id']);
});
}
public function down(): void
{
Schema::dropIfExists('project_task_handoffs');
}
};

View File

@ -99,7 +99,7 @@ services:
appstore: appstore:
container_name: "dootask-appstore-${APP_ID}" container_name: "dootask-appstore-${APP_ID}"
privileged: true privileged: true
image: "dootask/appstore:0.5.4" image: "dootask/appstore:0.5.6"
volumes: volumes:
- shared_data:/usr/share/dootask - shared_data:/usr/share/dootask
- ${HOST_DOCKER_SOCK:-/var/run/docker.sock}:/var/run/docker.sock - ${HOST_DOCKER_SOCK:-/var/run/docker.sock}:/var/run/docker.sock

1
electron/build.js vendored
View File

@ -347,6 +347,7 @@ async function startBuild(data) {
// system info // system info
const systemInfo = { const systemInfo = {
title: data.name, title: data.name,
loginLogo: "",
debug: "no", debug: "no",
version: config.version, version: config.version,
origin: "./", origin: "./",

View File

@ -8,9 +8,9 @@
"start": "electron-forge start", "start": "electron-forge start",
"start-quiet": "sleep 3 && electron-forge start", "start-quiet": "sleep 3 && electron-forge start",
"build": "electron-builder", "build": "electron-builder",
"build-mac": "electron-builder --mac", "build-mac": "node scripts/patch-mac-keychain.js && electron-builder --mac",
"build-win": "electron-builder --win", "build-win": "electron-builder --win",
"build-mac-publish": "electron-builder --publish always --mac", "build-mac-publish": "node scripts/patch-mac-keychain.js && electron-builder --publish always --mac",
"build-win-publish": "electron-builder --publish always --win", "build-win-publish": "electron-builder --publish always --win",
"package": "electron-forge package", "package": "electron-forge package",
"make": "electron-forge make", "make": "electron-forge make",

50
electron/scripts/patch-mac-keychain.js vendored Normal file
View File

@ -0,0 +1,50 @@
const fs = require('node:fs');
const path = require('node:path');
const {createRequire} = require('node:module');
// Remove this workaround once the supported builder uses the keychain password.
const replacements = [
['return await importCerts(keychainFile, certPaths, cscPasswords);',
'return await importCerts(keychainFile, certPaths, cscPasswords, keychainPassword);'],
['async function importCerts(keychainFile, paths, keyPasswords) {',
'async function importCerts(keychainFile, paths, keyPasswords, keychainPassword) {'],
['["set-key-partition-list", "-S", "apple-tool:,apple:", "-s", "-k", password, keychainFile]',
'["set-key-partition-list", "-S", "apple-tool:,apple:", "-s", "-k", keychainPassword, keychainFile]'],
];
function patchSource(source, version) {
if (!['26.8.1', '26.15.3'].includes(version)) {
throw new Error(`Unsupported app-builder-lib ${version}; review the macOS keychain workaround before building.`);
}
const count = (text) => source.split(text).length - 1;
if (replacements.every(([before, after]) => count(before) === 0 && count(after) === 1)) {
return source;
}
if (!replacements.every(([before, after]) => count(before) === 1 && count(after) === 0)) {
throw new Error('Unexpected macCodeSign.js source; refusing to apply the keychain workaround.');
}
for (const [before, after] of replacements) {
source = source.replace(before, after);
}
return source;
}
function patchInstalledBuilder() {
// Resolve from electron-builder so a nested dependency is patched correctly.
const builderRequire = createRequire(require.resolve('electron-builder/package.json'));
const packageFile = builderRequire.resolve('app-builder-lib/package.json');
const {version} = JSON.parse(fs.readFileSync(packageFile, 'utf8'));
const file = path.join(path.dirname(packageFile), 'out/codeSign/macCodeSign.js');
const source = fs.readFileSync(file, 'utf8');
const patched = patchSource(source, version);
if (patched !== source) {
fs.writeFileSync(file, patched);
}
console.log(`macOS keychain workaround ready (app-builder-lib ${version}).`);
}
if (require.main === module) {
patchInstalledBuilder();
}
module.exports = {patchSource};

View File

@ -0,0 +1,47 @@
const test = require('node:test');
const assert = require('node:assert/strict');
const vm = require('node:vm');
const {patchSource} = require('./patch-mac-keychain');
const source = `
async function createKeychain(keychainFile, certPaths, cscPasswords) {
const keychainPassword = "random-keychain-password";
return await importCerts(keychainFile, certPaths, cscPasswords);
}
async function importCerts(keychainFile, paths, keyPasswords) {
for (let i = 0; i < paths.length; i++) {
const password = keyPasswords[i] ?? "";
await exec("/usr/bin/security", ["import", paths[i], "-k", keychainFile, "-P", password]);
await exec("/usr/bin/security", ["set-key-partition-list", "-S", "apple-tool:,apple:", "-s", "-k", password, keychainFile]);
}
}
`;
for (const version of ['26.8.1', '26.15.3']) {
test(`patch is idempotent for ${version}`, () => {
const patched = patchSource(source, version);
assert.notEqual(patched, source);
assert.equal(patchSource(patched, version), patched);
});
}
for (const passwords of [[''], ['certificate-password'], ['distribution-password', 'installer-password']]) {
test(`keeps certificate passwords separate: ${passwords.length} certificate(s), empty=${passwords[0] === ''}`, async () => {
const calls = [];
const context = vm.createContext({exec: async (command, args) => calls.push({command, args})});
vm.runInContext(patchSource(source, '26.15.3'), context);
await context.createKeychain('test.keychain', passwords.map((_, i) => `cert-${i}.p12`), passwords);
assert.equal(calls.length, passwords.length * 2);
for (let i = 0; i < passwords.length; i++) {
assert.equal(calls[i * 2].args.at(-1), passwords[i]);
assert.equal(calls[i * 2 + 1].args.at(-2), 'random-keychain-password');
}
});
}
test('rejects unknown versions and changed or partially patched sources', () => {
assert.throws(() => patchSource(source, '27.0.0'), /Unsupported/);
assert.throws(() => patchSource(source.replace('return await importCerts', 'return importCerts'), '26.15.3'), /Unexpected/);
assert.throws(() => patchSource(source + source, '26.15.3'), /Unexpected/);
assert.throws(() => patchSource(source.replace('cscPasswords);', 'cscPasswords, keychainPassword);'), '26.15.3'), /Unexpected/);
});

View File

@ -1069,3 +1069,15 @@ WebDAV 未启用或你没有使用权限
目标不是文件夹 目标不是文件夹
请输入设备名称 请输入设备名称
复制的文件和文件夹数量超过限制 复制的文件和文件夹数量超过限制
任务流转未开启
当前任务不可指派
无指派权限
负责人已发生变化,请刷新后重试
不能移除管理范围外的负责人
所选负责人不在可指派范围内
负责人未发生变化
请填写指派留言
指派参数无效
流转设置选项无效
指派成功
任务负责人最多不能超过10个

View File

@ -1778,7 +1778,7 @@ WiFi签到延迟时长为±1分钟。
最多添加5个时间范围 最多添加5个时间范围
系统别名 系统别名
用于网页默认标题、邮件发送等 用于网页标题、邮件发送,以及 Web 端和客户端登录页的欢迎语。
打包权限 打包权限
允许所有人 允许所有人
@ -2739,3 +2739,47 @@ WebDAV 路径冲突
上传与媒体处理 上传与媒体处理
至少保留一项 至少保留一项
确定要删除该优先级吗? 确定要删除该优先级吗?
登录页 Logo
用于 Web 端和客户端登录页,未设置时使用默认 Logo。
本周到期
下周到期
本周排期
下周排期
已逾期
未排期
保留
新增
移除
标记已完成
任务归档
任务取消归档
指派负责人
状态流转
移交任务身份
重复任务
任务自动归档
流转记录
暂无流转记录
历史动态
保留负责人
管理范围外,不可移除
指派留言
流转
流转设置
任务流转
部门视角指派权限
仅部门负责人
部门负责人及部门管理员
可指派人员范围
管理部门范围内的项目成员
项目内全部成员
原负责人调整范围
仅调整管理范围内负责人
允许调整全部负责人
指派留言要求
指派成功
负责人未发生变化
请填写指派留言
任务负责人最多不能超过10个
展开显示更多

View File

@ -1,4 +1,472 @@
[ [
{
"key": "保留",
"zh": "",
"zh-CHT": "保留",
"en": "Keep",
"ko": "유지",
"ja": "保持",
"de": "Beibehalten",
"fr": "Conserver",
"id": "Pertahankan",
"ru": "Сохранить"
},
{
"key": "新增",
"zh": "",
"zh-CHT": "新增",
"en": "Add",
"ko": "추가",
"ja": "追加",
"de": "Hinzufügen",
"fr": "Ajouter",
"id": "Tambah",
"ru": "Добавить"
},
{
"key": "移除",
"zh": "",
"zh-CHT": "移除",
"en": "Remove",
"ko": "제거",
"ja": "削除",
"de": "Entfernen",
"fr": "Retirer",
"id": "Hapus",
"ru": "Удалить"
},
{
"key": "无",
"zh": "",
"zh-CHT": "無",
"en": "None",
"ko": "없음",
"ja": "なし",
"de": "Keine",
"fr": "Aucun",
"id": "Tidak ada",
"ru": "Нет"
},
{
"key": "标记已完成",
"zh": "",
"zh-CHT": "標記已完成",
"en": "Mark complete",
"ko": "완료로 표시",
"ja": "完了にする",
"de": "Als erledigt markieren",
"fr": "Marquer comme terminé",
"id": "Tandai selesai",
"ru": "Отметить выполненной"
},
{
"key": "指派负责人",
"zh": "",
"zh-CHT": "指派負責人",
"en": "Assign owners",
"ko": "담당자 지정",
"ja": "担当者を割り当て",
"de": "Verantwortliche zuweisen",
"fr": "Attribuer des responsables",
"id": "Tetapkan penanggung jawab",
"ru": "Назначить ответственных"
},
{
"key": "状态流转",
"zh": "",
"zh-CHT": "狀態流轉",
"en": "Status transition",
"ko": "상태 전환",
"ja": "ステータス遷移",
"de": "Statuswechsel",
"fr": "Transition de statut",
"id": "Perubahan status",
"ru": "Переход статуса"
},
{
"key": "重复任务",
"zh": "",
"zh-CHT": "重複任務",
"en": "Recurring task",
"ko": "반복 작업",
"ja": "繰り返しタスク",
"de": "Wiederkehrende Aufgabe",
"fr": "Tâche récurrente",
"id": "Tugas berulang",
"ru": "Повторяющаяся задача"
},
{
"key": "流转记录",
"zh": "",
"zh-CHT": "流轉記錄",
"en": "Handoff history",
"ko": "인계 기록",
"ja": "引き継ぎ履歴",
"de": "Übergabeverlauf",
"fr": "Historique des transmissions",
"id": "Riwayat serah terima",
"ru": "История передачи"
},
{
"key": "暂无流转记录",
"zh": "",
"zh-CHT": "暫無流轉記錄",
"en": "No handoff records",
"ko": "인계 기록 없음",
"ja": "引き継ぎ履歴はありません",
"de": "Keine Übergaben vorhanden",
"fr": "Aucune transmission",
"id": "Belum ada riwayat serah terima",
"ru": "Записей о передаче пока нет"
},
{
"key": "历史动态",
"zh": "",
"zh-CHT": "歷史動態",
"en": "Past activity",
"ko": "이전 활동",
"ja": "過去のアクティビティ",
"de": "Bisherige Aktivitäten",
"fr": "Activité passée",
"id": "Aktivitas sebelumnya",
"ru": "Предыдущие действия"
},
{
"key": "保留负责人",
"zh": "",
"zh-CHT": "保留負責人",
"en": "Retained owners",
"ko": "유지되는 담당자",
"ja": "継続する担当者",
"de": "Beibehaltene Verantwortliche",
"fr": "Responsables conservés",
"id": "Penanggung jawab dipertahankan",
"ru": "Сохраняемые ответственные"
},
{
"key": "管理范围外,不可移除",
"zh": "",
"zh-CHT": "管理範圍外,不可移除",
"en": "Outside your management scope; cannot be removed",
"ko": "관리 범위 밖이므로 제거할 수 없습니다",
"ja": "管理範囲外のため削除できません",
"de": "Außerhalb Ihres Zuständigkeitsbereichs; nicht entfernbar",
"fr": "Hors de votre périmètre de gestion ; retrait impossible",
"id": "Di luar cakupan pengelolaan; tidak dapat dihapus",
"ru": "Вне вашей области управления; удаление запрещено"
},
{
"key": "指派留言",
"zh": "",
"zh-CHT": "指派留言",
"en": "Assignment note",
"ko": "배정 메시지",
"ja": "割り当てメモ",
"de": "Zuweisungsnotiz",
"fr": "Note dattribution",
"id": "Catatan penugasan",
"ru": "Комментарий к назначению"
},
{
"key": "流转",
"zh": "",
"zh-CHT": "流轉",
"en": "Handoffs",
"ko": "인계",
"ja": "引き継ぎ",
"de": "Übergaben",
"fr": "Transmissions",
"id": "Serah terima",
"ru": "Передачи"
},
{
"key": "流转设置",
"zh": "",
"zh-CHT": "流轉設定",
"en": "Handoff settings",
"ko": "인계 설정",
"ja": "引き継ぎ設定",
"de": "Übergabeeinstellungen",
"fr": "Paramètres de transmission",
"id": "Pengaturan serah terima",
"ru": "Настройки передачи"
},
{
"key": "任务流转",
"zh": "",
"zh-CHT": "任務流轉",
"en": "Task handoffs",
"ko": "작업 인계",
"ja": "タスクの引き継ぎ",
"de": "Aufgabenübergaben",
"fr": "Transmission des tâches",
"id": "Serah terima tugas",
"ru": "Передача задач"
},
{
"key": "部门视角指派权限",
"zh": "",
"zh-CHT": "部門視角指派權限",
"en": "Assignment permission in department view",
"ko": "부서 보기 배정 권한",
"ja": "部門ビューでの割り当て権限",
"de": "Zuweisungsrecht in der Abteilungsansicht",
"fr": "Droit dattribution en vue département",
"id": "Izin penugasan pada tampilan departemen",
"ru": "Право назначения в режиме отдела"
},
{
"key": "仅部门负责人",
"zh": "",
"zh-CHT": "僅部門負責人",
"en": "Department heads only",
"ko": "부서 책임자만",
"ja": "部門責任者のみ",
"de": "Nur Abteilungsleiter",
"fr": "Responsables de département uniquement",
"id": "Hanya kepala departemen",
"ru": "Только руководители отделов"
},
{
"key": "部门负责人及部门管理员",
"zh": "",
"zh-CHT": "部門負責人及部門管理員",
"en": "Department heads and administrators",
"ko": "부서 책임자 및 관리자",
"ja": "部門責任者と部門管理者",
"de": "Abteilungsleiter und -administratoren",
"fr": "Responsables et administrateurs de département",
"id": "Kepala dan administrator departemen",
"ru": "Руководители и администраторы отделов"
},
{
"key": "可指派人员范围",
"zh": "",
"zh-CHT": "可指派人員範圍",
"en": "Assignable people",
"ko": "배정 가능한 인원 범위",
"ja": "割り当て可能なメンバー",
"de": "Zuweisbare Personen",
"fr": "Personnes pouvant être désignées",
"id": "Orang yang dapat ditugaskan",
"ru": "Круг назначаемых сотрудников"
},
{
"key": "管理部门范围内的项目成员",
"zh": "",
"zh-CHT": "管理部門範圍內的專案成員",
"en": "Project members in managed departments",
"ko": "관리 부서 내 프로젝트 구성원",
"ja": "管理対象部門のプロジェクトメンバー",
"de": "Projektmitglieder aus verwalteten Abteilungen",
"fr": "Membres du projet des départements gérés",
"id": "Anggota proyek di departemen yang dikelola",
"ru": "Участники проекта из управляемых отделов"
},
{
"key": "项目内全部成员",
"zh": "",
"zh-CHT": "專案內全部成員",
"en": "All project members",
"ko": "모든 프로젝트 구성원",
"ja": "プロジェクトの全メンバー",
"de": "Alle Projektmitglieder",
"fr": "Tous les membres du projet",
"id": "Semua anggota proyek",
"ru": "Все участники проекта"
},
{
"key": "原负责人调整范围",
"zh": "",
"zh-CHT": "原負責人調整範圍",
"en": "Existing owner adjustment scope",
"ko": "기존 담당자 변경 범위",
"ja": "既存担当者の変更範囲",
"de": "Änderungsbereich bestehender Verantwortlicher",
"fr": "Périmètre de modification des responsables actuels",
"id": "Cakupan perubahan penanggung jawab saat ini",
"ru": "Область изменения текущих ответственных"
},
{
"key": "仅调整管理范围内负责人",
"zh": "",
"zh-CHT": "僅調整管理範圍內負責人",
"en": "Only change owners within management scope",
"ko": "관리 범위 내 담당자만 변경",
"ja": "管理範囲内の担当者のみ変更",
"de": "Nur Verantwortliche im Zuständigkeitsbereich ändern",
"fr": "Modifier uniquement les responsables du périmètre géré",
"id": "Hanya ubah penanggung jawab dalam cakupan pengelolaan",
"ru": "Изменять только ответственных в области управления"
},
{
"key": "允许调整全部负责人",
"zh": "",
"zh-CHT": "允許調整全部負責人",
"en": "Allow changing all owners",
"ko": "모든 담당자 변경 허용",
"ja": "すべての担当者の変更を許可",
"de": "Änderung aller Verantwortlichen erlauben",
"fr": "Autoriser la modification de tous les responsables",
"id": "Izinkan perubahan semua penanggung jawab",
"ru": "Разрешить изменение всех ответственных"
},
{
"key": "指派留言要求",
"zh": "",
"zh-CHT": "指派留言要求",
"en": "Assignment note requirement",
"ko": "배정 메시지 필수 여부",
"ja": "割り当てメモの必須設定",
"de": "Pflicht für Zuweisungsnotizen",
"fr": "Exigence de note dattribution",
"id": "Persyaratan catatan penugasan",
"ru": "Обязательность комментария к назначению"
},
{
"key": "指派成功",
"zh": "",
"zh-CHT": "指派成功",
"en": "Assignment saved",
"ko": "배정 완료",
"ja": "割り当てました",
"de": "Zuweisung gespeichert",
"fr": "Attribution enregistrée",
"id": "Penugasan berhasil",
"ru": "Назначение сохранено"
},
{
"key": "负责人未发生变化",
"zh": "",
"zh-CHT": "負責人未發生變化",
"en": "Owners have not changed",
"ko": "담당자가 변경되지 않았습니다",
"ja": "担当者は変更されていません",
"de": "Verantwortliche wurden nicht geändert",
"fr": "Les responsables nont pas changé",
"id": "Penanggung jawab tidak berubah",
"ru": "Ответственные не изменились"
},
{
"key": "请填写指派留言",
"zh": "",
"zh-CHT": "請填寫指派留言",
"en": "Enter an assignment note",
"ko": "배정 메시지를 입력하세요",
"ja": "割り当てメモを入力してください",
"de": "Bitte eine Zuweisungsnotiz eingeben",
"fr": "Saisissez une note dattribution",
"id": "Masukkan catatan penugasan",
"ru": "Введите комментарий к назначению"
},
{
"key": "任务负责人最多不能超过10个",
"zh": "",
"zh-CHT": "任務負責人最多不能超過10個",
"en": "A task can have at most 10 owners",
"ko": "작업 담당자는 최대 10명입니다",
"ja": "タスクの担当者は最大10人です",
"de": "Eine Aufgabe darf höchstens 10 Verantwortliche haben",
"fr": "Une tâche peut avoir au maximum 10 responsables",
"id": "Tugas dapat memiliki maksimal 10 penanggung jawab",
"ru": "У задачи может быть не более 10 ответственных"
},
{
"key": "任务流转未开启",
"zh": "",
"zh-CHT": "任務流轉未開啟",
"en": "Task handoffs are disabled",
"ko": "작업 인계가 비활성화되어 있습니다",
"ja": "タスクの引き継ぎは無効です",
"de": "Aufgabenübergaben sind deaktiviert",
"fr": "La transmission des tâches est désactivée",
"id": "Serah terima tugas dinonaktifkan",
"ru": "Передача задач отключена"
},
{
"key": "当前任务不可指派",
"zh": "",
"zh-CHT": "目前任務不可指派",
"en": "This task cannot be assigned",
"ko": "이 작업은 배정할 수 없습니다",
"ja": "このタスクは割り当てできません",
"de": "Diese Aufgabe kann nicht zugewiesen werden",
"fr": "Cette tâche ne peut pas être attribuée",
"id": "Tugas ini tidak dapat ditugaskan",
"ru": "Эту задачу нельзя назначить"
},
{
"key": "无指派权限",
"zh": "",
"zh-CHT": "無指派權限",
"en": "No assignment permission",
"ko": "배정 권한이 없습니다",
"ja": "割り当て権限がありません",
"de": "Keine Zuweisungsberechtigung",
"fr": "Aucun droit dattribution",
"id": "Tidak memiliki izin penugasan",
"ru": "Нет прав на назначение"
},
{
"key": "负责人已发生变化,请刷新后重试",
"zh": "",
"zh-CHT": "負責人已發生變化,請重新整理後重試",
"en": "Owners have changed. Refresh and try again",
"ko": "담당자가 변경되었습니다. 새로고침 후 다시 시도하세요",
"ja": "担当者が変更されました。更新して再試行してください",
"de": "Verantwortliche wurden geändert. Bitte aktualisieren und erneut versuchen",
"fr": "Les responsables ont changé. Actualisez et réessayez",
"id": "Penanggung jawab telah berubah. Muat ulang dan coba lagi",
"ru": "Ответственные изменились. Обновите данные и повторите попытку"
},
{
"key": "不能移除管理范围外的负责人",
"zh": "",
"zh-CHT": "不能移除管理範圍外的負責人",
"en": "Cannot remove owners outside management scope",
"ko": "관리 범위 밖의 담당자는 제거할 수 없습니다",
"ja": "管理範囲外の担当者は削除できません",
"de": "Verantwortliche außerhalb des Zuständigkeitsbereichs können nicht entfernt werden",
"fr": "Impossible de retirer les responsables hors du périmètre géré",
"id": "Tidak dapat menghapus penanggung jawab di luar cakupan pengelolaan",
"ru": "Нельзя удалять ответственных вне области управления"
},
{
"key": "所选负责人不在可指派范围内",
"zh": "",
"zh-CHT": "所選負責人不在可指派範圍內",
"en": "Selected owners are outside the assignable scope",
"ko": "선택한 담당자가 배정 가능한 범위 밖에 있습니다",
"ja": "選択した担当者は割り当て可能な範囲外です",
"de": "Ausgewählte Verantwortliche liegen außerhalb des zulässigen Bereichs",
"fr": "Les responsables sélectionnés sont hors du périmètre autorisé",
"id": "Penanggung jawab yang dipilih di luar cakupan penugasan",
"ru": "Выбранные ответственные вне допустимого круга назначения"
},
{
"key": "指派参数无效",
"zh": "",
"zh-CHT": "指派參數無效",
"en": "Invalid assignment parameters",
"ko": "배정 매개변수가 유효하지 않습니다",
"ja": "割り当てパラメータが無効です",
"de": "Ungültige Zuweisungsparameter",
"fr": "Paramètres dattribution invalides",
"id": "Parameter penugasan tidak valid",
"ru": "Недопустимые параметры назначения"
},
{
"key": "流转设置选项无效",
"zh": "",
"zh-CHT": "流轉設定選項無效",
"en": "Invalid handoff setting",
"ko": "인계 설정 옵션이 유효하지 않습니다",
"ja": "引き継ぎ設定の選択肢が無効です",
"de": "Ungültige Übergabeeinstellung",
"fr": "Option de transmission invalide",
"id": "Opsi pengaturan serah terima tidak valid",
"ru": "Недопустимый параметр передачи"
},
{ {
"key": "(%T1)是一款轻量级的开源在线项目任务管理工具提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM文件管理等工具。", "key": "(%T1)是一款轻量级的开源在线项目任务管理工具提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM文件管理等工具。",
"zh": "", "zh": "",
@ -25380,16 +25848,16 @@
"ru": "Системный псевдоним" "ru": "Системный псевдоним"
}, },
{ {
"key": "用于网页默认标题、邮件发送等", "key": "用于网页标题、邮件发送,以及 Web 端和客户端登录页的欢迎语。",
"zh": "", "zh": "",
"zh-CHT": "用於網頁默認標題、郵件發送等", "zh-CHT": "用於網頁標題、郵件發送,以及 Web 端和客戶端登入頁的歡迎語。",
"en": "Used for web default titles, email sending, etc.", "en": "Used for webpage titles, email delivery, and the welcome message on Web and client login pages.",
"ko": "웹 기본 제목, 이메일 전송 등에 사용", "ko": "웹 페이지 제목, 이메일 발송, Web 및 클라이언트 로그인 페이지의 환영 문구에 사용됩니다.",
"ja": "ウェブのデフォルトタイトル、メール送信などに使用されます", "ja": "Webページのタイトル、メール送信、Web版およびクライアント版のログインページのウェルカムメッセージに使用されます。",
"de": "Wird für Web-Standardtitel, E-Mail-Versand usw. verwendet", "de": "Wird für Webseitentitel, den E-Mail-Versand und die Begrüßung auf den Anmeldeseiten der Web- und Client-Version verwendet.",
"fr": "Utilisé pour les titres par défaut des pages Web, l'envoi d'e-mails, etc.", "fr": "Utilisé pour les titres des pages Web, l'envoi d'e-mails et le message de bienvenue des pages de connexion Web et client.",
"id": "Digunakan untuk judul default web, pengiriman email, dll.", "id": "Digunakan untuk judul halaman web, pengiriman email, dan pesan sambutan pada halaman login Web dan klien.",
"ru": "Используется для веб-страниц по умолчанию, отправки электронной почты и т. д." "ru": "Используется для заголовков веб-страниц, отправки электронной почты и приветствия на страницах входа веб-версии и клиента."
}, },
{ {
"key": "打包下载【(%T1)】文件夹", "key": "打包下载【(%T1)】文件夹",
@ -39586,5 +40054,113 @@
"fr": "Afficher dans le dossier", "fr": "Afficher dans le dossier",
"id": "Tampilkan di Folder", "id": "Tampilkan di Folder",
"ru": "Показать в папке" "ru": "Показать в папке"
},
{
"key": "登录页 Logo",
"zh": "",
"zh-CHT": "登錄頁 Logo",
"en": "Login Page Logo",
"ko": "로그인 페이지 로고",
"ja": "ログインページのロゴ",
"de": "Logo der Anmeldeseite",
"fr": "Logo de la page de connexion",
"id": "Logo Halaman Masuk",
"ru": "Логотип страницы входа"
},
{
"key": "用于 Web 端和客户端登录页,未设置时使用默认 Logo。",
"zh": "",
"zh-CHT": "用於 Web 端和客戶端登入頁,未設定時使用預設 Logo。",
"en": "Used on Web and client login pages. The default logo is used when not configured.",
"ko": "Web 및 클라이언트 로그인 페이지에 사용되며, 설정하지 않으면 기본 로고가 사용됩니다.",
"ja": "Web版およびクライアント版のログインページで使用されます。未設定の場合はデフォルトのロゴが使用されます。",
"de": "Wird auf den Anmeldeseiten der Web- und Client-Version verwendet. Ohne Konfiguration wird das Standardlogo verwendet.",
"fr": "Utilisé sur les pages de connexion Web et client. Le logo par défaut est utilisé si aucun logo n'est configuré.",
"id": "Digunakan pada halaman login Web dan klien. Logo default digunakan jika tidak dikonfigurasi.",
"ru": "Используется на страницах входа веб-версии и клиента. Если не настроено, используется логотип по умолчанию."
},
{
"key": "本周到期",
"zh": "",
"zh-CHT": "本週到期",
"en": "Due this week",
"ko": "이번 주 마감",
"ja": "今週が期限",
"de": "Diese Woche fällig",
"fr": "À échéance cette semaine",
"id": "Jatuh tempo minggu ini",
"ru": "Срок на этой неделе"
},
{
"key": "下周到期",
"zh": "",
"zh-CHT": "下週到期",
"en": "Due next week",
"ko": "다음 주 마감",
"ja": "来週が期限",
"de": "Nächste Woche fällig",
"fr": "À échéance la semaine prochaine",
"id": "Jatuh tempo minggu depan",
"ru": "Срок на следующей неделе"
},
{
"key": "本周排期",
"zh": "",
"zh-CHT": "本週排期",
"en": "Scheduled this week",
"ko": "이번 주 예정",
"ja": "今週の予定",
"de": "Diese Woche geplant",
"fr": "Planifiées cette semaine",
"id": "Dijadwalkan minggu ini",
"ru": "Запланировано на эту неделю"
},
{
"key": "下周排期",
"zh": "",
"zh-CHT": "下週排期",
"en": "Scheduled next week",
"ko": "다음 주 예정",
"ja": "来週の予定",
"de": "Nächste Woche geplant",
"fr": "Planifiées la semaine prochaine",
"id": "Dijadwalkan minggu depan",
"ru": "Запланировано на следующую неделю"
},
{
"key": "已逾期",
"zh": "",
"zh-CHT": "已逾期",
"en": "Overdue",
"ko": "기한 초과",
"ja": "期限超過",
"de": "Überfällig",
"fr": "En retard",
"id": "Lewat tenggat",
"ru": "Просроченные"
},
{
"key": "未排期",
"zh": "",
"zh-CHT": "未排期",
"en": "Unscheduled",
"ko": "일정 미정",
"ja": "予定未設定",
"de": "Nicht geplant",
"fr": "Non planifiées",
"id": "Belum dijadwalkan",
"ru": "Не запланированы"
},
{
"key": "展开显示更多",
"zh": "",
"zh-CHT": "展開顯示更多",
"en": "Show more",
"ko": "더 보기",
"ja": "さらに表示",
"de": "Mehr anzeigen",
"fr": "Afficher plus",
"id": "Tampilkan lebih banyak",
"ru": "Показать больше"
} }
] ]

View File

@ -1,7 +1,7 @@
{ {
"name": "DooTask", "name": "DooTask",
"version": "1.9.18", "version": "1.9.36",
"codeVerson": 242, "codeVerson": 243,
"description": "DooTask is task management system.", "description": "DooTask is task management system.",
"scripts": { "scripts": {
"start": "./cmd dev", "start": "./cmd dev",
@ -67,7 +67,7 @@
"stylus-loader": "^7.1.0", "stylus-loader": "^7.1.0",
"tinymce": "^5.10.3", "tinymce": "^5.10.3",
"tui-calendar-hi": "^2.1.3-6", "tui-calendar-hi": "^2.1.3-6",
"view-design-hi": "^4.7.0-80", "view-design-hi": "^4.7.0-81",
"vite": "^2.9.15", "vite": "^2.9.15",
"vite-plugin-file-copy": "^1.0.0", "vite-plugin-file-copy": "^1.0.0",
"vite-plugin-require": "^1.1.10", "vite-plugin-require": "^1.1.10",

View File

@ -0,0 +1,27 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Time / Calendar">
<g clip-path="url(#clip0_0_65)">
<path id="Vector" d="M1.16667 7C1.16667 4.80011 1.16667 3.70017 1.85008 3.01675C2.5335 2.33333 3.63345 2.33333 5.83333 2.33333H8.16667C10.3666 2.33333 11.4665 2.33333 12.1499 3.01675C12.8333 3.70017 12.8333 4.80011 12.8333 7V8.16667C12.8333 10.3666 12.8333 11.4665 12.1499 12.1499C11.4665 12.8333 10.3666 12.8333 8.16667 12.8333H5.83333C3.63345 12.8333 2.5335 12.8333 1.85008 12.1499C1.16667 11.4665 1.16667 10.3666 1.16667 8.16667V7Z" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_2" d="M4.08333 2.33333V1.45833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_3" d="M9.91667 2.33333V1.45833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_4" d="M1.45833 5.25H12.5417" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<g id="Vector_5">
<path d="M10.5 9.91667C10.5 10.2388 10.2388 10.5 9.91667 10.5C9.5945 10.5 9.33333 10.2388 9.33333 9.91667C9.33333 9.5945 9.5945 9.33333 9.91667 9.33333C10.2388 9.33333 10.5 9.5945 10.5 9.91667Z" fill="#999999"/>
<path d="M10.5 7.58333C10.5 7.9055 10.2388 8.16667 9.91667 8.16667C9.5945 8.16667 9.33333 7.9055 9.33333 7.58333C9.33333 7.26117 9.5945 7 9.91667 7C10.2388 7 10.5 7.26117 10.5 7.58333Z" fill="#999999"/>
</g>
<g id="Vector_6">
<path d="M7.58333 9.91667C7.58333 10.2388 7.32217 10.5 7 10.5C6.67783 10.5 6.41667 10.2388 6.41667 9.91667C6.41667 9.5945 6.67783 9.33333 7 9.33333C7.32217 9.33333 7.58333 9.5945 7.58333 9.91667Z" fill="#999999"/>
<path d="M7.58333 7.58333C7.58333 7.9055 7.32217 8.16667 7 8.16667C6.67783 8.16667 6.41667 7.9055 6.41667 7.58333C6.41667 7.26117 6.67783 7 7 7C7.32217 7 7.58333 7.26117 7.58333 7.58333Z" fill="#999999"/>
</g>
<g id="Vector_7">
<path d="M4.66667 9.91667C4.66667 10.2388 4.4055 10.5 4.08333 10.5C3.76117 10.5 3.5 10.2388 3.5 9.91667C3.5 9.5945 3.76117 9.33333 4.08333 9.33333C4.4055 9.33333 4.66667 9.5945 4.66667 9.91667Z" fill="#999999"/>
<path d="M4.66667 7.58333C4.66667 7.9055 4.4055 8.16667 4.08333 8.16667C3.76117 8.16667 3.5 7.9055 3.5 7.58333C3.5 7.26117 3.76117 7 4.08333 7C4.4055 7 4.66667 7.26117 4.66667 7.58333Z" fill="#999999"/>
</g>
</g>
</g>
<defs>
<clipPath id="clip0_0_65">
<rect width="14" height="14" rx="5" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Arrows / Alt Arrow Down">
<path id="Vector" d="M12.6667 6L8 10L3.33333 6" stroke="#666666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 353 B

View File

@ -0,0 +1,19 @@
<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="75" cy="75" r="60" fill="#3B3B3C"/>
<mask id="mask0_469_19160" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="15" y="15" width="120" height="120">
<circle cx="75" cy="75" r="60" fill="#F2F3F6"/>
</mask>
<g mask="url(#mask0_469_19160)">
<rect x="33.5" y="43.5" width="83" height="98" rx="3.5" fill="#636365" stroke="#292929"/>
<rect x="54" y="97" width="42" height="6" rx="3" fill="#8B8B8C"/>
<rect x="54" y="109" width="42" height="6" rx="3" fill="#8B8B8C"/>
<rect x="64" y="121" width="22" height="6" rx="3" fill="#8B8B8C"/>
<path d="M90.8136 57.885C91.9852 56.7134 93.8852 56.7134 95.0568 57.885C96.2279 59.0565 96.2279 60.9557 95.0568 62.1272L73.6144 83.5695C73.0964 84.0875 72.4357 84.3758 71.7589 84.4357C70.8924 84.5243 69.9951 84.2373 69.3312 83.5734L56.1212 70.3635C54.9499 69.1919 54.9497 67.2928 56.1212 66.1213C57.2927 64.9498 59.1918 64.95 60.3634 66.1213L71.4699 77.2277L90.8136 57.885Z" fill="#A9A9A9"/>
<path d="M90.8136 57.885L91.1672 58.2385L91.1672 58.2385L90.8136 57.885ZM95.0568 57.885L95.4104 57.5315L95.4103 57.5314L95.0568 57.885ZM95.0568 62.1272L95.4103 62.4807L95.4104 62.4807L95.0568 62.1272ZM71.7589 84.4357L71.7148 83.9377L71.7081 83.9383L71.7589 84.4357ZM69.3312 83.5734L68.9776 83.927V83.927L69.3312 83.5734ZM56.1212 70.3635L55.7676 70.717L55.7677 70.717L56.1212 70.3635ZM56.1212 66.1213L55.7677 65.7677L55.7677 65.7677L56.1212 66.1213ZM60.3634 66.1213L60.717 65.7677L60.7169 65.7677L60.3634 66.1213ZM71.4699 77.2277L71.1163 77.5813C71.3116 77.7766 71.6281 77.7766 71.8234 77.5813L71.4699 77.2277ZM90.8136 57.885L91.1672 58.2385C92.1435 57.2622 93.7269 57.2622 94.7032 58.2385L95.0568 57.885L95.4103 57.5314C94.0435 56.1646 91.8269 56.1646 90.4601 57.5314L90.8136 57.885ZM95.0568 57.885L94.7032 58.2385C95.6791 59.2147 95.6791 60.7974 94.7032 61.7736L95.0568 62.1272L95.4104 62.4807C96.7767 61.1139 96.7767 58.8982 95.4104 57.5315L95.0568 57.885ZM95.0568 62.1272L94.7032 61.7736L73.2608 83.216L73.6144 83.5695L73.9679 83.9231L95.4103 62.4807L95.0568 62.1272ZM73.6144 83.5695L73.2608 83.216C72.8291 83.6477 72.2795 83.8877 71.7148 83.9377L71.7589 84.4357L71.803 84.9338C72.592 84.8639 73.3636 84.5274 73.9679 83.9231L73.6144 83.5695ZM71.7589 84.4357L71.7081 83.9383C70.9845 84.0123 70.2377 83.7728 69.6847 83.2199L69.3312 83.5734L68.9776 83.927C69.7525 84.7019 70.8004 85.0363 71.8097 84.9332L71.7589 84.4357ZM69.3312 83.5734L69.6847 83.2199L56.4748 70.0099L56.1212 70.3635L55.7677 70.717L68.9776 83.927L69.3312 83.5734ZM56.1212 70.3635L56.4748 70.01C55.4987 69.0336 55.4986 67.451 56.4748 66.4748L56.1212 66.1213L55.7677 65.7677C54.4009 67.1345 54.4011 69.3502 55.7676 70.717L56.1212 70.3635ZM56.1212 66.1213L56.4748 66.4748C57.451 65.4987 59.0335 65.4987 60.0099 66.4749L60.3634 66.1213L60.7169 65.7677C59.3501 64.4012 57.1345 64.4009 55.7677 65.7677L56.1212 66.1213ZM60.3634 66.1213L60.0099 66.4748L71.1163 77.5813L71.4699 77.2277L71.8234 76.8742L60.717 65.7677L60.3634 66.1213ZM71.4699 77.2277L71.8234 77.5813L91.1672 58.2385L90.8136 57.885L90.4601 57.5314L71.1163 76.8742L71.4699 77.2277Z" fill="#363638"/>
</g>
<circle cx="75" cy="75" r="59.5" stroke="#515151"/>
<circle cx="17" cy="29" r="3" fill="#3B3B3C"/>
<circle cx="146" cy="15" r="3" fill="#3B3B3C"/>
<circle cx="139" cy="32" r="5" fill="#3B3B3C"/>
<circle cx="8" cy="112" r="6" fill="#3B3B3C"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,29 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="147" height="123" viewBox="0 0 147 123" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 3">
<g id="Group 5">
<circle id="Ellipse 5" cx="73" cy="63" r="60" fill="#EBECEE"/>
<g id="Mask group">
<mask id="mask0_0_4" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="13" y="3" width="120" height="120">
<circle id="Ellipse 6" cx="73" cy="63" r="60" fill="#F2F3F6"/>
</mask>
<g mask="url(#mask0_0_4)">
<g id="Group 4">
<rect id="Rectangle 4" x="31.5" y="31.5" width="83" height="98" rx="3.5" fill="white" stroke="#D2D4DB"/>
<rect id="Rectangle 5" opacity="0.3" x="52" y="85" width="42" height="6" rx="3" fill="#515A6E"/>
<rect id="Rectangle 6" opacity="0.3" x="52" y="97" width="42" height="6" rx="3" fill="#515A6E"/>
<rect id="Rectangle 7" opacity="0.3" x="62" y="109" width="22" height="6" rx="3" fill="#515A6E"/>
<g id="Union" opacity="0.3">
<path d="M88.8137 45.885C89.9853 44.7134 91.8853 44.7134 93.0569 45.885C94.228 47.0565 94.228 48.9557 93.0569 50.1272L71.6145 71.5696C71.0965 72.0876 70.4358 72.3758 69.759 72.4358C68.8925 72.5243 67.9952 72.2374 67.3313 71.5735L54.1213 58.3635C52.95 57.1919 52.9498 55.2928 54.1213 54.1213C55.2928 52.9498 57.1919 52.95 58.3635 54.1213L69.47 65.2278L88.8137 45.885Z" fill="#515A6E"/>
<path d="M88.8137 45.885L89.1673 46.2386L89.1673 46.2385L88.8137 45.885ZM93.0569 45.885L93.4105 45.5315L93.4104 45.5314L93.0569 45.885ZM93.0569 50.1272L93.4104 50.4807L93.4105 50.4807L93.0569 50.1272ZM69.759 72.4358L69.7149 71.9377L69.7082 71.9384L69.759 72.4358ZM67.3313 71.5735L66.9777 71.927V71.927L67.3313 71.5735ZM54.1213 58.3635L53.7677 58.717L53.7678 58.7171L54.1213 58.3635ZM54.1213 54.1213L53.7678 53.7678L53.7678 53.7678L54.1213 54.1213ZM58.3635 54.1213L58.7171 53.7678L58.717 53.7677L58.3635 54.1213ZM69.47 65.2278L69.1164 65.5813C69.3117 65.7766 69.6282 65.7766 69.8235 65.5813L69.47 65.2278ZM88.8137 45.885L89.1673 46.2385C90.1436 45.2622 91.727 45.2622 92.7033 46.2385L93.0569 45.885L93.4104 45.5314C92.0436 44.1646 89.827 44.1646 88.4602 45.5314L88.8137 45.885ZM93.0569 45.885L92.7033 46.2385C93.6792 47.2148 93.6792 48.7975 92.7033 49.7737L93.0569 50.1272L93.4105 50.4807C94.7768 49.1139 94.7768 46.8982 93.4105 45.5315L93.0569 45.885ZM93.0569 50.1272L92.7033 49.7736L71.2609 71.216L71.6145 71.5696L71.968 71.9231L93.4104 50.4807L93.0569 50.1272ZM71.6145 71.5696L71.2609 71.216C70.8292 71.6477 70.2796 71.8877 69.7149 71.9377L69.759 72.4358L69.8031 72.9338C70.5921 72.864 71.3637 72.5274 71.968 71.9231L71.6145 71.5696ZM69.759 72.4358L69.7082 71.9384C68.9846 72.0123 68.2378 71.7729 67.6848 71.2199L67.3313 71.5735L66.9777 71.927C67.7526 72.7019 68.8005 73.0363 69.8098 72.9332L69.759 72.4358ZM67.3313 71.5735L67.6848 71.2199L54.4749 58.01L54.1213 58.3635L53.7678 58.7171L66.9777 71.927L67.3313 71.5735ZM54.1213 58.3635L54.4749 58.01C53.4988 57.0336 53.4987 55.4511 54.4749 54.4749L54.1213 54.1213L53.7678 53.7678C52.401 55.1346 52.4012 57.3502 53.7677 58.717L54.1213 58.3635ZM54.1213 54.1213L54.4749 54.4749C55.4511 53.4987 57.0336 53.4988 58.01 54.4749L58.3635 54.1213L58.717 53.7677C57.3502 52.4012 55.1346 52.401 53.7678 53.7678L54.1213 54.1213ZM58.3635 54.1213L58.01 54.4749L69.1164 65.5813L69.47 65.2278L69.8235 64.8742L58.7171 53.7678L58.3635 54.1213ZM69.47 65.2278L69.8235 65.5813L89.1673 46.2386L88.8137 45.885L88.4602 45.5314L69.1164 64.8742L69.47 65.2278Z" fill="#001034"/>
</g>
</g>
</g>
</g>
<circle id="Ellipse 6_2" cx="73" cy="63" r="59.5" stroke="#CBCDD3"/>
</g>
<circle id="Ellipse 2" cx="15" cy="17" r="3" fill="#EBECEE"/>
<circle id="Ellipse 3" cx="144" cy="3" r="3" fill="#EBECEE"/>
<circle id="Ellipse 4" cx="137" cy="20" r="5" fill="#EBECEE"/>
<circle id="Ellipse 1" cx="6" cy="100" r="6" fill="#EBECEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,6 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Users / User">
<circle id="Vector" cx="7" cy="3.5" r="2.33333" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_2" d="M11.6667 10.2083C11.6667 11.6581 11.6667 12.8333 7 12.8333C2.33333 12.8333 2.33333 11.6581 2.33333 10.2083C2.33333 8.75859 4.42267 7.58333 7 7.58333C9.57733 7.58333 11.6667 8.75859 11.6667 10.2083Z" stroke="#999999" stroke-width="1.25"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 557 B

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Essentional, UI / Flag 2">
<path id="Vector" d="M2.91667 12.8333V8.16667M2.91667 8.16667V2.33333M2.91667 8.16667L4.35789 7.87842C5.3207 7.68586 6.31873 7.77749 7.23038 8.14215C8.21828 8.53731 9.30558 8.6111 10.3378 8.35305L10.3962 8.33844C10.7381 8.25297 10.9002 7.86152 10.7189 7.55934L9.80856 6.04204C9.60935 5.71003 9.50975 5.54403 9.48614 5.36346C9.47629 5.28814 9.47629 5.21186 9.48614 5.13654C9.50975 4.95597 9.60935 4.78997 9.80856 4.45796L10.5544 3.21493C10.7496 2.8896 10.454 2.49067 10.0859 2.58269C9.21744 2.79981 8.30263 2.73772 7.47146 2.40525L7.23038 2.30882C6.31873 1.94416 5.3207 1.85253 4.35789 2.04509L2.91667 2.33333M2.91667 2.33333V1.16667" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 917 B

View File

@ -0,0 +1,12 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Folders / Folder With Files" clip-path="url(#clip0_0_53)">
<path id="Vector" d="M10.5 5.83333L7.58333 5.83333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_2" d="M5.83333 1.75H9.625C9.89591 1.75 10.0314 1.75 10.1451 1.76497C10.9304 1.86836 11.5483 2.4863 11.6517 3.27158C11.6667 3.3853 11.6667 3.52075 11.6667 3.79167" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_3" d="M1.16667 4.05402C1.16667 3.53921 1.16667 3.2818 1.20712 3.06739C1.38521 2.12351 2.12351 1.38521 3.06739 1.20712C3.2818 1.16667 3.53921 1.16667 4.05402 1.16667C4.27958 1.16667 4.39236 1.16667 4.50075 1.1768C4.96805 1.2205 5.4113 1.4041 5.77263 1.70363C5.85644 1.77311 5.93619 1.85286 6.09569 2.01235L6.41667 2.33333C6.89254 2.8092 7.13047 3.04714 7.4154 3.20566C7.57192 3.29275 7.73795 3.36152 7.91021 3.41062C8.22377 3.5 8.56027 3.5 9.23325 3.5H9.45122C10.9868 3.5 11.7545 3.5 12.2536 3.94885C12.2995 3.99014 12.3432 4.03383 12.3845 4.07973C12.8333 4.57879 12.8333 5.34656 12.8333 6.88211V8.16667C12.8333 10.3666 12.8333 11.4665 12.1499 12.1499C11.4665 12.8333 10.3666 12.8333 8.16667 12.8333H5.83333C3.63345 12.8333 2.5335 12.8333 1.85008 12.1499C1.16667 11.4665 1.16667 10.3666 1.16667 8.16667V4.05402Z" stroke="#999999" stroke-width="1.25"/>
</g>
<defs>
<clipPath id="clip0_0_53">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Astronomy / Star">
<path id="Vector" d="M7 11.6667V10.2667M7 3.73333V2.33333M11.6667 7H10.2667M3.73333 7H2.33333M10.2998 3.70017L9.30988 4.69012M4.69012 9.30988L3.70017 10.2998M3.70004 3.70027L4.68999 4.69022M9.30976 9.30998L10.2997 10.2999" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 498 B

View File

@ -0,0 +1,10 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / List / Checklist">
<path id="Vector" d="M1.16667 3.20833L1.875 4.08333L4.375 1.75" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M1.16667 7.29167L1.875 8.16667L4.375 5.83333" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M1.16667 11.375L1.875 12.25L4.375 9.91667" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M12.8333 11.0833L7 11.0833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_5" d="M12.8333 7L7 7" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_6" d="M12.8333 2.91667L7 2.91667" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 997 B

View File

@ -0,0 +1,7 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / List / List">
<path id="Vector" d="M11.6667 4.08333L2.33333 4.08333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_2" d="M8.75 7L2.33333 7" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_3" d="M5.25 9.91667H2.33333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 537 B

View File

@ -1 +1 @@
import{n as m}from"./app.61df582b.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var p=function(){var t=this,r=t.$createElement;return t._self._c,t._m(0)},e=[function(){var t=this,r=t.$createElement,i=t._self._c||r;return i("div",{staticClass:"page-404"},[i("div",{staticClass:"flex-center position-ref full-height"},[i("div",{staticClass:"code"},[t._v("404")]),i("div",{staticClass:"message"},[t._v("Not Found")])])])}];const s={},o={};var _=m(s,p,e,!1,n,"7d7154a8",null,null);function n(t){for(let r in o)this[r]=o[r]}var it=function(){return _.exports}();export{it as default}; import{n as m}from"./app.818b057c.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var p=function(){var t=this,r=t.$createElement;return t._self._c,t._m(0)},e=[function(){var t=this,r=t.$createElement,i=t._self._c||r;return i("div",{staticClass:"page-404"},[i("div",{staticClass:"flex-center position-ref full-height"},[i("div",{staticClass:"code"},[t._v("404")]),i("div",{staticClass:"message"},[t._v("Not Found")])])])}];const s={},o={};var _=m(s,p,e,!1,n,"7d7154a8",null,null);function n(t){for(let r in o)this[r]=o[r]}var it=function(){return _.exports}();export{it as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{m as i}from"./vuex.cc7cb26e.js";import{n as d}from"./app.61df582b.js";var o=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("Modal",{attrs:{value:t.value,title:t.modalTitle,"mask-closable":!1,width:"520"},on:{input:function(s){return t.$emit("input",s)}}},[e("div",{staticClass:"department-owner-view-modal"},[e("Alert",{attrs:{type:"info","show-icon":""}},[t.scopeOnly?[t._v(t._s(t.$L("\u9009\u62E9\u9700\u8981\u7EDF\u8BA1\u7684\u90E8\u95E8\uFF0C\u5305\u542B\u6240\u9009\u90E8\u95E8\u53CA\u5176\u6240\u6709\u4E0B\u7EA7\u90E8\u95E8\u3002")))]:[t._v(t._s(t.$L("\u90E8\u95E8\u8303\u56F4\u4E0E\u8D1F\u8D23\u4EBA\u4EEA\u8868\u76D8\u4FDD\u6301\u4E00\u81F4\uFF1B\u5F00\u542F\u540E\uFF0C\u53EF\u53EA\u8BFB\u67E5\u770B\u8303\u56F4\u5185\u6210\u5458\u53C2\u4E0E\u7684\u9879\u76EE\u548C\u4EFB\u52A1\u3002")))]],2),t.scopeOnly?t._e():e("div",{staticClass:"department-owner-view-switch"},[e("div",[e("strong",[t._v(t._s(t.$L("\u5728\u9879\u76EE\u5217\u8868\u4E2D\u542F\u7528")))]),e("span",{staticClass:"department-owner-view-switch-desc"},[t._v(t._s(t.$L("\u5F00\u542F\u540E\u5728\u9879\u76EE\u5217\u8868\u4E2D\u663E\u793A\u989D\u5916\u7684\u53EA\u8BFB\u9879\u76EE")))])]),e("iSwitch",{model:{value:t.draftProjectViewEnabled,callback:function(s){t.draftProjectViewEnabled=s},expression:"draftProjectViewEnabled"}})],1),t.scopeOnly||t.draftProjectViewEnabled?[t.managedDepartments.length>1?e("div",{staticClass:"department-owner-view-actions"},[e("a",{attrs:{href:"javascript:void(0)"},on:{click:function(s){t.draftIds=[]}}},[t._v(t._s(t.$L("\u6E05\u7A7A")))]),e("a",{attrs:{href:"javascript:void(0)"},on:{click:function(s){t.draftIds=t.managedDepartments.map(function(n){return n.id})}}},[t._v(t._s(t.$L("\u5168\u9009")))]),e("a",{attrs:{href:"javascript:void(0)"},on:{click:t.reverseDraft}},[t._v(t._s(t.$L("\u53CD\u9009")))])]):t._e(),e("CheckboxGroup",{staticClass:"department-owner-view-list",model:{value:t.draftIds,callback:function(s){t.draftIds=s},expression:"draftIds"}},t._l(t.managedDepartments,function(s){return e("div",{key:s.id,class:["department-owner-view-item",t.draftIds.includes(s.id)?"active":""],on:{click:function(n){return t.toggleDraft(s.id)}}},[e("div",{staticClass:"department-owner-view-icon"},[e("i",{staticClass:"taskfont"},[t._v("\uE75C")])]),e("div",{staticClass:"department-owner-view-name"},[t._v(t._s(s.name))]),e("Checkbox",{staticClass:"department-owner-view-checkbox",attrs:{label:s.id},nativeOn:{click:function(n){n.stopPropagation()}}},[e("span")])],1)}),0)]:t._e()],2),e("div",{staticClass:"adaption",attrs:{slot:"footer"},slot:"footer"},[e("Button",{attrs:{type:"default",disabled:t.applyLoading},on:{click:function(s){return t.$emit("input",!1)}}},[t._v(t._s(t.$L("\u53D6\u6D88")))]),e("Button",{attrs:{type:"primary",disabled:t.draftIds.length===0,loading:t.applyLoading},on:{click:t.apply}},[t._v(t._s(t.$L("\u786E\u5B9A")))])],1)])},l=[];const c={name:"DepartmentOwnerView",props:{value:Boolean,scopeOnly:Boolean},data(){return{draftIds:[],draftProjectViewEnabled:!1,applyLoading:!1}},computed:{...i(["userInfo","cacheDepartmentOwnerIds","departmentOwnerProjectViewEnabled"]),modalTitle(){return this.scopeOnly?this.$L("\u9009\u62E9\u56E2\u961F\u8303\u56F4"):this.$L("\u9879\u76EE\u8D1F\u8D23\u4EBA\u89C6\u89D2")},managedDepartments(){return(this.userInfo.managed_departments||[]).map(t=>({...t,id:parseInt(t.id)}))}},watch:{value:{immediate:!0,handler(t){if(t){const a=(this.cacheDepartmentOwnerIds||[]).slice();this.draftIds=a.length>0?a:this.managedDepartments.map(e=>e.id),this.draftProjectViewEnabled=this.departmentOwnerProjectViewEnabled}else this.applyLoading=!1}}},methods:{toggleDraft(t){t=parseInt(t);const a=this.draftIds.indexOf(t);a>-1?this.draftIds.splice(a,1):this.draftIds.push(t)},reverseDraft(){const t=this.draftIds.map(a=>parseInt(a));this.draftIds=this.managedDepartments.map(a=>a.id).filter(a=>!t.includes(a))},async apply(){if(!this.applyLoading){this.applyLoading=!0;try{await this.$store.dispatch("setDepartmentOwnerIds",this.scopeOnly?this.draftIds:{ids:this.draftIds,projectViewEnabled:this.draftProjectViewEnabled}),this.$emit("input",!1)}catch(t){$A.modalError((t==null?void 0:t.msg)||this.$L("\u5207\u6362\u5931\u8D25"))}finally{this.applyLoading=!1}}}}},r={};var p=d(c,o,l,!1,f,"61d09b1f",null,null);function f(t){for(let a in r)this[a]=r[a]}var u=function(){return p.exports}();export{u as D}; import{m as i}from"./vuex.cc7cb26e.js";import{n as d}from"./app.818b057c.js";var o=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("Modal",{attrs:{value:t.value,title:t.modalTitle,"mask-closable":!1,width:"520"},on:{input:function(s){return t.$emit("input",s)}}},[e("div",{staticClass:"department-owner-view-modal"},[e("Alert",{attrs:{type:"info","show-icon":""}},[t.scopeOnly?[t._v(t._s(t.$L("\u9009\u62E9\u9700\u8981\u7EDF\u8BA1\u7684\u90E8\u95E8\uFF0C\u5305\u542B\u6240\u9009\u90E8\u95E8\u53CA\u5176\u6240\u6709\u4E0B\u7EA7\u90E8\u95E8\u3002")))]:[t._v(t._s(t.$L("\u90E8\u95E8\u8303\u56F4\u4E0E\u8D1F\u8D23\u4EBA\u4EEA\u8868\u76D8\u4FDD\u6301\u4E00\u81F4\uFF1B\u5F00\u542F\u540E\uFF0C\u53EF\u53EA\u8BFB\u67E5\u770B\u8303\u56F4\u5185\u6210\u5458\u53C2\u4E0E\u7684\u9879\u76EE\u548C\u4EFB\u52A1\u3002")))]],2),t.scopeOnly?t._e():e("div",{staticClass:"department-owner-view-switch"},[e("div",[e("strong",[t._v(t._s(t.$L("\u5728\u9879\u76EE\u5217\u8868\u4E2D\u542F\u7528")))]),e("span",{staticClass:"department-owner-view-switch-desc"},[t._v(t._s(t.$L("\u5F00\u542F\u540E\u5728\u9879\u76EE\u5217\u8868\u4E2D\u663E\u793A\u989D\u5916\u7684\u53EA\u8BFB\u9879\u76EE")))])]),e("iSwitch",{model:{value:t.draftProjectViewEnabled,callback:function(s){t.draftProjectViewEnabled=s},expression:"draftProjectViewEnabled"}})],1),t.scopeOnly||t.draftProjectViewEnabled?[t.managedDepartments.length>1?e("div",{staticClass:"department-owner-view-actions"},[e("a",{attrs:{href:"javascript:void(0)"},on:{click:function(s){t.draftIds=[]}}},[t._v(t._s(t.$L("\u6E05\u7A7A")))]),e("a",{attrs:{href:"javascript:void(0)"},on:{click:function(s){t.draftIds=t.managedDepartments.map(function(n){return n.id})}}},[t._v(t._s(t.$L("\u5168\u9009")))]),e("a",{attrs:{href:"javascript:void(0)"},on:{click:t.reverseDraft}},[t._v(t._s(t.$L("\u53CD\u9009")))])]):t._e(),e("CheckboxGroup",{staticClass:"department-owner-view-list",model:{value:t.draftIds,callback:function(s){t.draftIds=s},expression:"draftIds"}},t._l(t.managedDepartments,function(s){return e("div",{key:s.id,class:["department-owner-view-item",t.draftIds.includes(s.id)?"active":""],on:{click:function(n){return t.toggleDraft(s.id)}}},[e("div",{staticClass:"department-owner-view-icon"},[e("i",{staticClass:"taskfont"},[t._v("\uE75C")])]),e("div",{staticClass:"department-owner-view-name"},[t._v(t._s(s.name))]),e("Checkbox",{staticClass:"department-owner-view-checkbox",attrs:{label:s.id},nativeOn:{click:function(n){n.stopPropagation()}}},[e("span")])],1)}),0)]:t._e()],2),e("div",{staticClass:"adaption",attrs:{slot:"footer"},slot:"footer"},[e("Button",{attrs:{type:"default",disabled:t.applyLoading},on:{click:function(s){return t.$emit("input",!1)}}},[t._v(t._s(t.$L("\u53D6\u6D88")))]),e("Button",{attrs:{type:"primary",disabled:t.draftIds.length===0,loading:t.applyLoading},on:{click:t.apply}},[t._v(t._s(t.$L("\u786E\u5B9A")))])],1)])},l=[];const c={name:"DepartmentOwnerView",props:{value:Boolean,scopeOnly:Boolean},data(){return{draftIds:[],draftProjectViewEnabled:!1,applyLoading:!1}},computed:{...i(["userInfo","cacheDepartmentOwnerIds","departmentOwnerProjectViewEnabled"]),modalTitle(){return this.scopeOnly?this.$L("\u9009\u62E9\u56E2\u961F\u8303\u56F4"):this.$L("\u9879\u76EE\u8D1F\u8D23\u4EBA\u89C6\u89D2")},managedDepartments(){return(this.userInfo.managed_departments||[]).map(t=>({...t,id:parseInt(t.id)}))}},watch:{value:{immediate:!0,handler(t){if(t){const a=(this.cacheDepartmentOwnerIds||[]).slice();this.draftIds=a.length>0?a:this.managedDepartments.map(e=>e.id),this.draftProjectViewEnabled=this.departmentOwnerProjectViewEnabled}else this.applyLoading=!1}}},methods:{toggleDraft(t){t=parseInt(t);const a=this.draftIds.indexOf(t);a>-1?this.draftIds.splice(a,1):this.draftIds.push(t)},reverseDraft(){const t=this.draftIds.map(a=>parseInt(a));this.draftIds=this.managedDepartments.map(a=>a.id).filter(a=>!t.includes(a))},async apply(){if(!this.applyLoading){this.applyLoading=!0;try{await this.$store.dispatch("setDepartmentOwnerIds",this.scopeOnly?this.draftIds:{ids:this.draftIds,projectViewEnabled:this.draftProjectViewEnabled}),this.$emit("input",!1)}catch(t){$A.modalError((t==null?void 0:t.msg)||this.$L("\u5207\u6362\u5931\u8D25"))}finally{this.applyLoading=!1}}}}},r={};var p=d(c,o,l,!1,f,"61d09b1f",null,null);function f(t){for(let a in r)this[a]=r[a]}var u=function(){return p.exports}();export{u as D};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{m as s}from"./vuex.cc7cb26e.js";import{I as m}from"./IFrame.c096b4d0.js";import{n as p,l as o}from"./app.61df582b.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var l=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"drawio-content"},[i("IFrame",{ref:"frame",staticClass:"drawio-iframe",attrs:{src:t.url},on:{"on-message":t.onMessage}}),t.loadIng?i("div",{staticClass:"drawio-loading"},[i("Loading")],1):t._e()],1)},d=[];const u={name:"Drawio",components:{IFrame:m},props:{value:{type:Object,default:function(){return{}}},title:{type:String,default:""},readOnly:{type:Boolean,default:!1}},data(){return{loadIng:!0,url:null,bakData:""}},created(){let t=o;switch(o){case"zh-CHT":t="zh-tw";break}let e=this.readOnly?1:0,i=this.readOnly?0:1,n=this.themeName==="dark"?"dark":"kennedy",r=`?title=${this.title?encodeURIComponent(this.title):""}&chrome=${i}&lightbox=${e}&ui=${n}&lang=${t}&offline=1&pwa=0&embed=1&noLangIcon=1&noExitBtn=1&noSaveBtn=1&saveAndExit=0&spin=1&proto=json`;this.$Electron?this.url=$A.originUrl(`drawio/webapp/index.html${r}`):this.url=$A.mainUrl(`drawio/webapp/${r}`)},mounted(){window.addEventListener("message",this.handleMessage)},beforeDestroy(){window.removeEventListener("message",this.handleMessage)},watch:{value:{handler(t){this.bakData!=$A.jsonStringify(t)&&(this.bakData=$A.jsonStringify(t),this.updateContent())},deep:!0}},computed:{...s(["themeName"])},methods:{formatZoom(t){return t+"%"},updateContent(){this.$refs.frame.postMessage(JSON.stringify({action:"load",autosave:1,xml:this.value.xml}))},onMessage(t){switch(t.event){case"init":this.loadIng=!1,this.updateContent();break;case"load":typeof this.value.xml=="undefined"&&this.$refs.frame.postMessage(JSON.stringify({action:"template"}));break;case"autosave":const e={xml:t.xml};this.bakData=$A.jsonStringify(e),this.$emit("input",e);break;case"save":this.$emit("saveData");break}}}},a={};var c=p(u,l,d,!1,h,"86e491c2",null,null);function h(t){for(let e in a)this[e]=a[e]}var pt=function(){return c.exports}();export{pt as default}; import{m as s}from"./vuex.cc7cb26e.js";import{I as m}from"./IFrame.7112b2ed.js";import{n as p,l as o}from"./app.818b057c.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var l=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"drawio-content"},[i("IFrame",{ref:"frame",staticClass:"drawio-iframe",attrs:{src:t.url},on:{"on-message":t.onMessage}}),t.loadIng?i("div",{staticClass:"drawio-loading"},[i("Loading")],1):t._e()],1)},d=[];const u={name:"Drawio",components:{IFrame:m},props:{value:{type:Object,default:function(){return{}}},title:{type:String,default:""},readOnly:{type:Boolean,default:!1}},data(){return{loadIng:!0,url:null,bakData:""}},created(){let t=o;switch(o){case"zh-CHT":t="zh-tw";break}let e=this.readOnly?1:0,i=this.readOnly?0:1,n=this.themeName==="dark"?"dark":"kennedy",r=`?title=${this.title?encodeURIComponent(this.title):""}&chrome=${i}&lightbox=${e}&ui=${n}&lang=${t}&offline=1&pwa=0&embed=1&noLangIcon=1&noExitBtn=1&noSaveBtn=1&saveAndExit=0&spin=1&proto=json`;this.$Electron?this.url=$A.originUrl(`drawio/webapp/index.html${r}`):this.url=$A.mainUrl(`drawio/webapp/${r}`)},mounted(){window.addEventListener("message",this.handleMessage)},beforeDestroy(){window.removeEventListener("message",this.handleMessage)},watch:{value:{handler(t){this.bakData!=$A.jsonStringify(t)&&(this.bakData=$A.jsonStringify(t),this.updateContent())},deep:!0}},computed:{...s(["themeName"])},methods:{formatZoom(t){return t+"%"},updateContent(){this.$refs.frame.postMessage(JSON.stringify({action:"load",autosave:1,xml:this.value.xml}))},onMessage(t){switch(t.event){case"init":this.loadIng=!1,this.updateContent();break;case"load":typeof this.value.xml=="undefined"&&this.$refs.frame.postMessage(JSON.stringify({action:"template"}));break;case"autosave":const e={xml:t.xml};this.bakData=$A.jsonStringify(e),this.$emit("input",e);break;case"save":this.$emit("saveData");break}}}},a={};var c=p(u,l,d,!1,h,"86e491c2",null,null);function h(t){for(let e in a)this[e]=a[e]}var pt=function(){return c.exports}();export{pt as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{n}from"./app.61df582b.js";var i=function(){var e=this,s=e.$createElement,r=e._self._c||s;return r("iframe",{directives:[{name:"show",rawName:"v-show",value:e.src,expression:"src"}],ref:"iframe",attrs:{src:e.src}})},a=[];const o={name:"IFrame",props:{src:{type:String,default:""}},mounted(){this.$refs.iframe.addEventListener("load",this.handleLoad),window.addEventListener("message",this.handleMessage)},beforeDestroy(){this.$refs.iframe.removeEventListener("load",this.handleLoad),window.removeEventListener("message",this.handleMessage)},methods:{handleLoad(){this.$emit("on-load")},handleMessage({data:e,source:s}){var r;s===((r=this.$refs.iframe)==null?void 0:r.contentWindow)&&(e=$A.jsonParse(e),e.source==="fileView"&&e.action==="picture"&&this.$store.dispatch("previewImage",{index:e.params.index,list:e.params.array}),this.$emit("on-message",e))},postMessage(e,s="*"){this.$refs.iframe&&this.$refs.iframe.contentWindow.postMessage(e,s)}}},t={};var m=n(o,i,a,!1,c,null,null,null);function c(e){for(let s in t)this[s]=t[s]}var l=function(){return m.exports}();export{l as I}; import{n}from"./app.818b057c.js";var i=function(){var e=this,s=e.$createElement,r=e._self._c||s;return r("iframe",{directives:[{name:"show",rawName:"v-show",value:e.src,expression:"src"}],ref:"iframe",attrs:{src:e.src}})},a=[];const o={name:"IFrame",props:{src:{type:String,default:""}},mounted(){this.$refs.iframe.addEventListener("load",this.handleLoad),window.addEventListener("message",this.handleMessage)},beforeDestroy(){this.$refs.iframe.removeEventListener("load",this.handleLoad),window.removeEventListener("message",this.handleMessage)},methods:{handleLoad(){this.$emit("on-load")},handleMessage({data:e,source:s}){var r;s===((r=this.$refs.iframe)==null?void 0:r.contentWindow)&&(e=$A.jsonParse(e),e.source==="fileView"&&e.action==="picture"&&this.$store.dispatch("previewImage",{index:e.params.index,list:e.params.array}),this.$emit("on-message",e))},postMessage(e,s="*"){this.$refs.iframe&&this.$refs.iframe.contentWindow.postMessage(e,s)}}},t={};var m=n(o,i,a,!1,c,null,null,null);function c(e){for(let s in t)this[s]=t[s]}var l=function(){return m.exports}();export{l as I};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{n as r}from"./app.61df582b.js";var a=function(){var t=this,n=t.$createElement,e=t._self._c||n;return t.windowTouch?e("div",[e("Button",{attrs:{loading:t.loading,type:"primary",icon:"ios-search"},on:{click:t.onSearch}},[t._v(t._s(t.$L("\u641C\u7D22")))]),t.filtering?e("Button",{attrs:{type:"text"},on:{click:t.onCancelFilter}},[t._v(t._s(t.$L("\u53D6\u6D88\u7B5B\u9009")))]):e("Button",{attrs:{loading:t.loading,type:"text",icon:"md-refresh"},on:{click:t.onRefresh}},[t._v(t._s(t.$L("\u5237\u65B0")))])],1):e("Tooltip",{attrs:{theme:"light",placement:t.placement,"transfer-class-name":"search-button-clear",transfer:""}},[e("Button",{attrs:{loading:t.loading,type:"primary",icon:"ios-search"},on:{click:t.onSearch}},[t._v(t._s(t.$L("\u641C\u7D22")))]),e("div",{attrs:{slot:"content"},slot:"content"},[t.filtering?e("Button",{attrs:{type:"text"},on:{click:t.onCancelFilter}},[t._v(t._s(t.$L("\u53D6\u6D88\u7B5B\u9009")))]):e("Button",{attrs:{loading:t.loading,type:"text"},on:{click:t.onRefresh}},[t._v(t._s(t.$L("\u5237\u65B0")))])],1)],1)},i=[];const l={name:"SearchButton",props:{loading:{type:Boolean,default:!1},filtering:{type:Boolean,default:!1},placement:{type:String,default:"bottom"}},methods:{onSearch(){this.$emit("search")},onRefresh(){this.$emit("refresh")},onCancelFilter(){this.$emit("cancelFilter")}}},o={};var s=r(l,a,i,!1,c,null,null,null);function c(t){for(let n in o)this[n]=o[n]}var h=function(){return s.exports}();export{h as S}; import{n as r}from"./app.818b057c.js";var a=function(){var t=this,n=t.$createElement,e=t._self._c||n;return t.windowTouch?e("div",[e("Button",{attrs:{loading:t.loading,type:"primary",icon:"ios-search"},on:{click:t.onSearch}},[t._v(t._s(t.$L("\u641C\u7D22")))]),t.filtering?e("Button",{attrs:{type:"text"},on:{click:t.onCancelFilter}},[t._v(t._s(t.$L("\u53D6\u6D88\u7B5B\u9009")))]):e("Button",{attrs:{loading:t.loading,type:"text",icon:"md-refresh"},on:{click:t.onRefresh}},[t._v(t._s(t.$L("\u5237\u65B0")))])],1):e("Tooltip",{attrs:{theme:"light",placement:t.placement,"transfer-class-name":"search-button-clear",transfer:""}},[e("Button",{attrs:{loading:t.loading,type:"primary",icon:"ios-search"},on:{click:t.onSearch}},[t._v(t._s(t.$L("\u641C\u7D22")))]),e("div",{attrs:{slot:"content"},slot:"content"},[t.filtering?e("Button",{attrs:{type:"text"},on:{click:t.onCancelFilter}},[t._v(t._s(t.$L("\u53D6\u6D88\u7B5B\u9009")))]):e("Button",{attrs:{loading:t.loading,type:"text"},on:{click:t.onRefresh}},[t._v(t._s(t.$L("\u5237\u65B0")))])],1)],1)},i=[];const l={name:"SearchButton",props:{loading:{type:Boolean,default:!1},filtering:{type:Boolean,default:!1},placement:{type:String,default:"bottom"}},methods:{onSearch(){this.$emit("search")},onRefresh(){this.$emit("refresh")},onCancelFilter(){this.$emit("cancelFilter")}}},o={};var s=r(l,a,i,!1,c,null,null,null);function c(t){for(let n in o)this[n]=o[n]}var h=function(){return s.exports}();export{h as S};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
.task-editor[data-v-4e70a0a5]{position:relative;word-break:break-all}.task-editor[data-v-4e70a0a5] .mce-content-body,.task-editor[data-v-4e70a0a5] .task-editor-content{line-height:1.6}.task-editor[data-v-4e70a0a5] p{margin:.3em 0}.task-editor[data-v-4e70a0a5] blockquote,.task-editor[data-v-4e70a0a5] pre,.task-editor[data-v-4e70a0a5] ul,.task-editor[data-v-4e70a0a5] ol{margin:1em 0}.task-editor[data-v-4e70a0a5] ul,.task-editor[data-v-4e70a0a5] ol{margin-left:1.5em;padding-left:1.5em}.task-editor[data-v-4e70a0a5] li{margin:.25em 0}.task-editor[data-v-4e70a0a5] h1{margin:.67em 0}.task-editor[data-v-4e70a0a5] h2{margin:.83em 0}.task-editor[data-v-4e70a0a5] h3{margin:1em 0}.task-editor[data-v-4e70a0a5] h4{margin:1.33em 0}.task-editor[data-v-4e70a0a5] h5{margin:1.67em 0}.task-editor[data-v-4e70a0a5] h6{margin:2.33em 0}.task-editor .task-editor-operate[data-v-4e70a0a5]{position:absolute;top:0;left:0;width:1px;opacity:0;visibility:hidden;pointer-events:none}.task-tag-select[data-v-5700cf7a]{width:100%;display:flex;flex-direction:column}.task-tag-select.no-search .search-box[data-v-5700cf7a]{display:none}.task-tag-select.no-search .tag-list .tag-item[data-v-5700cf7a]:first-child{margin-top:0}.task-tag-select .search-box[data-v-5700cf7a]{padding-bottom:8px;border-bottom:1px solid #eee}.task-tag-select .search-box .search-input[data-v-5700cf7a]{width:100%;height:34px;padding:0 12px;border:1px solid #dcdfe6;border-radius:4px;outline:none}.task-tag-select .search-box .search-input[data-v-5700cf7a]:focus{border-color:#84c56a}.task-tag-select .tag-list[data-v-5700cf7a]{flex:1;overflow-y:auto;max-height:300px;margin:0 -12px;padding:0 12px}.task-tag-select .tag-list .tag-item[data-v-5700cf7a]{display:flex;align-items:flex-start;padding:8px 12px;cursor:pointer;border-radius:6px;margin-bottom:6px}.task-tag-select .tag-list .tag-item[data-v-5700cf7a]:first-child{margin-top:12px}.task-tag-select .tag-list .tag-item[data-v-5700cf7a]:last-child{margin-bottom:12px}.task-tag-select .tag-list .tag-item[data-v-5700cf7a]:hover{background-color:#f5f7fa}.task-tag-select .tag-list .tag-item.is-selected[data-v-5700cf7a]{background-color:#ecf5ff}.task-tag-select .tag-list .tag-item .tag-color[data-v-5700cf7a]{width:16px;height:16px;border-radius:4px;margin-right:8px;margin-top:2px}.task-tag-select .tag-list .tag-item .tag-info[data-v-5700cf7a]{flex:1}.task-tag-select .tag-list .tag-item .tag-info .tag-name[data-v-5700cf7a]{line-height:20px;font-size:14px;color:#303133}.task-tag-select .tag-list .tag-item .tag-info .tag-desc[data-v-5700cf7a]{font-size:12px;color:#909399;margin-top:2px}.task-tag-select .tag-list .tag-item .tag-check[data-v-5700cf7a]{color:#84c56a;margin-left:12px;height:20px;display:flex;align-items:center}.task-tag-select .tag-list .no-data[data-v-5700cf7a]{text-align:center;color:#909399;padding:24px 0;margin-bottom:12px}.task-tag-select .footer-box[data-v-5700cf7a]{border-top:1px solid #eee;padding-top:8px}.task-tag-select .footer-box .add-button[data-v-5700cf7a]{display:flex;align-items:center;justify-content:center;padding:4px 0 2px;cursor:pointer;color:#84c56a;border-radius:6px;transition:color .2s}.task-tag-select .footer-box .add-button[data-v-5700cf7a]:hover{color:#a2d98d}.task-tag-select .footer-box .add-button i[data-v-5700cf7a]{margin-right:4px}.task-content-history .ivu-page[data-v-a0030d34]{margin-top:12px;display:flex;align-items:center;justify-content:center}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

7
public/js/build/app.e77c9e40.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{m}from"./vuex.cc7cb26e.js";import{M as e}from"./index.b6905d71.js";import{n as a}from"./app.61df582b.js";import"./vue.adba9046.js";import"./@babel.9410f858.js";import"./view-design-hi.f1128b4d.js";import"./@micro-zoe.39406924.js";import"./DialogWrapper.3c680ae9.js";import"./chunkedUpload.f6cef7c7.js";import"./axios.37c7f908.js";import"./spark-md5.0443325f.js";import"./index.0e9ced87.js";import"./vue-virtual-scroll-list-hi.74ad83f0.js";import"./lodash.8fcd6fd4.js";import"./ImgUpload.595f2641.js";import"./webhook.378987f3.js";import"./jquery.c18cbaba.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./openpgp_hi.15f91b1d.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./html-to-md.f297036e.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var n=function(){var t=this,o=t.$createElement,r=t._self._c||o;return r("MicroApps",{ref:"app",attrs:{"window-type":"popout"}})},s=[];const u={components:{MicroApps:e},computed:{...m(["userIsAdmin"])},async mounted(){const{name:t}=this.$route.params;if(!t){$A.modalError("\u5E94\u7528\u4E0D\u5B58\u5728");return}if(t==="iframe-test"){if(!this.userIsAdmin){$A.modalError("\u4EC5\u7BA1\u7406\u5458\u53EF\u4F7F\u7528\u6B64\u529F\u80FD");return}let{url:r}=this.$route.query;if(!r){if(r=await this.promptIframeUrl(),!r)return;this.$router.replace({path:this.$route.path,query:{...this.$route.query,url:r}}).catch(()=>{})}await this.$refs.app.onOpen({id:"iframe-test",name:"iframe-test",url:r,type:"iframe",transparent:!0,keep_alive:!1});return}const o=(await $A.IDBArray("cacheMicroApps")).reverse().find(r=>r.name===t);if(!o){$A.modalError("\u5E94\u7528\u4E0D\u5B58\u5728");return}await this.$refs.app.onOpen(o)},methods:{promptIframeUrl(){return new Promise((t,o)=>{$A.modalInput({title:this.$L("\u8BF7\u8F93\u5165 URL"),placeholder:"https://example.com",onOk:r=>{const i=(r||"").trim();if(!i)return this.$L("URL\u4E0D\u80FD\u4E3A\u7A7A");t(i)},onCancel:()=>o()})}).catch(()=>null)}}},p={};var c=a(u,n,s,!1,l,null,null,null);function l(t){for(let o in p)this[o]=p[o]}var hr=function(){return c.exports}();export{hr as default}; import{m}from"./vuex.cc7cb26e.js";import{M as e}from"./index.a1e57906.js";import{n as a}from"./app.818b057c.js";import"./vue.adba9046.js";import"./@babel.9410f858.js";import"./view-design-hi.24419422.js";import"./@micro-zoe.39406924.js";import"./DialogWrapper.21630cce.js";import"./chunkedUpload.a9ef725e.js";import"./axios.37c7f908.js";import"./spark-md5.0443325f.js";import"./index.ab4b7604.js";import"./vue-virtual-scroll-list-hi.74ad83f0.js";import"./lodash.8fcd6fd4.js";import"./ImgUpload.a99f26bd.js";import"./webhook.378987f3.js";import"./jquery.c87f487f.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./openpgp_hi.15f91b1d.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./html-to-md.f297036e.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var n=function(){var t=this,o=t.$createElement,r=t._self._c||o;return r("MicroApps",{ref:"app",attrs:{"window-type":"popout"}})},s=[];const u={components:{MicroApps:e},computed:{...m(["userIsAdmin"])},async mounted(){const{name:t}=this.$route.params;if(!t){$A.modalError("\u5E94\u7528\u4E0D\u5B58\u5728");return}if(t==="iframe-test"){if(!this.userIsAdmin){$A.modalError("\u4EC5\u7BA1\u7406\u5458\u53EF\u4F7F\u7528\u6B64\u529F\u80FD");return}let{url:r}=this.$route.query;if(!r){if(r=await this.promptIframeUrl(),!r)return;this.$router.replace({path:this.$route.path,query:{...this.$route.query,url:r}}).catch(()=>{})}await this.$refs.app.onOpen({id:"iframe-test",name:"iframe-test",url:r,type:"iframe",transparent:!0,keep_alive:!1});return}const o=(await $A.IDBArray("cacheMicroApps")).reverse().find(r=>r.name===t);if(!o){$A.modalError("\u5E94\u7528\u4E0D\u5B58\u5728");return}await this.$refs.app.onOpen(o)},methods:{promptIframeUrl(){return new Promise((t,o)=>{$A.modalInput({title:this.$L("\u8BF7\u8F93\u5165 URL"),placeholder:"https://example.com",onOk:r=>{const i=(r||"").trim();if(!i)return this.$L("URL\u4E0D\u80FD\u4E3A\u7A7A");t(i)},onCancel:()=>o()})}).catch(()=>null)}}},p={};var c=a(u,n,s,!1,l,null,null,null);function l(t){for(let o in p)this[o]=p[o]}var hr=function(){return c.exports}();export{hr as default};

View File

@ -1 +1 @@
import{m as s}from"./vuex.cc7cb26e.js";import{r as e,u as m,e as n,n as l}from"./app.61df582b.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var p=function(){var t=this,i=t.$createElement,o=t._self._c||i;return o("div",{staticClass:"setting-item submit"},[o("Form",t._b({ref:"formData",attrs:{model:t.formData},nativeOn:{submit:function(r){r.preventDefault()}}},"Form",t.formOptions,!1),[o("FormItem",{attrs:{label:t.$L("\u663E\u793A\u60AC\u6D6E\u6309\u94AE")}},[o("iSwitch",{attrs:{disabled:t.loading},model:{value:t.formData.floatButtonVisible,callback:function(r){t.$set(t.formData,"floatButtonVisible",r)},expression:"formData.floatButtonVisible"}})],1)],1),o("div",{staticClass:"setting-footer"},[o("Button",{attrs:{loading:t.loadIng>0,disabled:t.loading,type:"primary"},on:{click:t.submitForm}},[t._v(t._s(t.$L("\u63D0\u4EA4")))]),o("Button",{attrs:{loading:t.loadIng>0,disabled:t.loading},on:{click:t.resetForm}},[t._v(t._s(t.$L("\u91CD\u7F6E")))])],1)],1)},u=[];const d={data(){return{loadIng:0,loading:!0,formData:{floatButtonVisible:!0}}},computed:{...s(["userId","formOptions"])},mounted(){this.loadPreference()},methods:{async loadPreference(){try{this.$set(this.formData,"floatButtonVisible",await e(this.userId)),this.formData_bak=$A.cloneJSON(this.formData)}finally{this.loading=!1}},async submitForm(){const t=this.formData.floatButtonVisible;this.loadIng++;try{await m(this.userId,t),n.emit("aiAssistantFloatButtonVisibilityChanged",{userId:this.userId,visible:t}),$A.messageSuccess("\u4FDD\u5B58\u6210\u529F")}catch(i){$A.modalError(i.message)}finally{this.loadIng--}},resetForm(){this.formData=$A.cloneJSON(this.formData_bak)}}},a={};var f=l(d,p,u,!1,c,null,null,null);function c(t){for(let i in a)this[i]=a[i]}var mt=function(){return f.exports}();export{mt as default}; import{m as s}from"./vuex.cc7cb26e.js";import{r as e,u as m,e as n,n as l}from"./app.818b057c.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var p=function(){var t=this,i=t.$createElement,o=t._self._c||i;return o("div",{staticClass:"setting-item submit"},[o("Form",t._b({ref:"formData",attrs:{model:t.formData},nativeOn:{submit:function(r){r.preventDefault()}}},"Form",t.formOptions,!1),[o("FormItem",{attrs:{label:t.$L("\u663E\u793A\u60AC\u6D6E\u6309\u94AE")}},[o("iSwitch",{attrs:{disabled:t.loading},model:{value:t.formData.floatButtonVisible,callback:function(r){t.$set(t.formData,"floatButtonVisible",r)},expression:"formData.floatButtonVisible"}})],1)],1),o("div",{staticClass:"setting-footer"},[o("Button",{attrs:{loading:t.loadIng>0,disabled:t.loading,type:"primary"},on:{click:t.submitForm}},[t._v(t._s(t.$L("\u63D0\u4EA4")))]),o("Button",{attrs:{loading:t.loadIng>0,disabled:t.loading},on:{click:t.resetForm}},[t._v(t._s(t.$L("\u91CD\u7F6E")))])],1)],1)},u=[];const d={data(){return{loadIng:0,loading:!0,formData:{floatButtonVisible:!0}}},computed:{...s(["userId","formOptions"])},mounted(){this.loadPreference()},methods:{async loadPreference(){try{this.$set(this.formData,"floatButtonVisible",await e(this.userId)),this.formData_bak=$A.cloneJSON(this.formData)}finally{this.loading=!1}},async submitForm(){const t=this.formData.floatButtonVisible;this.loadIng++;try{await m(this.userId,t),n.emit("aiAssistantFloatButtonVisibilityChanged",{userId:this.userId,visible:t}),$A.messageSuccess("\u4FDD\u5B58\u6210\u529F")}catch(i){$A.modalError(i.message)}finally{this.loadIng--}},resetForm(){this.formData=$A.cloneJSON(this.formData_bak)}}},a={};var f=l(d,p,u,!1,c,null,null,null);function c(t){for(let i in a)this[i]=a[i]}var mt=function(){return f.exports}();export{mt as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{a as k}from"./axios.37c7f908.js";import{S as x}from"./spark-md5.0443325f.js";import{s as D,l as O}from"./app.61df582b.js";const j=10*1024*1024,U=3,M=3,C="chunked_upload:",P=new Set(["\u4E0A\u4F20\u4F1A\u8BDD\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F","\u4E0A\u4F20\u4F1A\u8BDD\u5F52\u5C5E\u9519\u8BEF","\u5206\u7247\u5E8F\u53F7\u8D85\u51FA\u8303\u56F4","\u5206\u7247\u5927\u5C0F\u4E0D\u7B26\u5408\u9884\u671F","\u672B\u5C3E\u5206\u7247\u5927\u5C0F\u4E0D\u7B26\u5408\u9884\u671F"]);function H(t,e){return t==="hashing"?Math.round(e*.05):t==="uploading"?5+Math.round(e*.9):95+Math.round(e*.05)}async function G({file:t,scene:e,sceneParams:d={},onProgress:a,onStart:i,signal:r}){const n=typeof a=="function"?a:()=>{},o=(s,h)=>n(H(s,h),s);o("hashing",0);const w=await B(t,r,(s,h)=>{o("hashing",Math.min(99,Math.round(s/h*100)))});if(o("hashing",100),r&&r.aborted)throw new Error("aborted");const c=await S("upload/init",{hash:w,size:t.size,name:t.name,scene:e,scene_params:d},r);if(c.ret!==1)throw new Error(c.msg||"\u4E0A\u4F20\u521D\u59CB\u5316\u5931\u8D25");if(c.data&&c.data.done)return o("uploading",100),o("merging",100),c.data;const{upload_id:p,chunk_size:l,chunk_count:g,received:A}=c.data;if(F(w,p,e),typeof i=="function")try{i(p)}catch{}const y=new Set((A||[]).map(Number)),f=[];for(let s=0;s<g;s++)y.has(s)||f.push(s);let E=y.size;const b=()=>{o("uploading",Math.min(99,Math.round(E/g*100)))};b();let N=0,u=null;const z=async()=>{for(;;){if(u)return;if(r&&r.aborted){u=new Error("aborted");return}const s=N++;if(s>=f.length)return;const h=f[s],_=h*l,L=Math.min(_+l,t.size),T=t.slice(_,L);try{await $(p,h,T,r),E++,b()}catch(v){u||(u=v);return}}},I=Math.min(U,f.length||1);if(await Promise.all(Array.from({length:I},()=>z())),u)throw u;o("uploading",100),o("merging",0);const m=await S("upload/merge",{upload_id:p},r);if(m.ret!==1)throw new Error(m.msg||"\u5408\u5E76\u5931\u8D25");return o("merging",100),X(w),m.data}async function $(t,e,d,a){let i;for(let r=0;r<=M;r++){if(a&&a.aborted)throw new Error("aborted");try{const n=new FormData;n.append("upload_id",t),n.append("index",String(e)),n.append("blob",d);const o=await k.post(window.$A.apiUrl("upload/chunk"),n,{headers:R(),signal:a});if(o.data&&o.data.ret===1)return o.data.data;i=new Error(o.data&&o.data.msg||"\u5206\u7247\u4E0A\u4F20\u5931\u8D25")}catch(n){if(a&&a.aborted)throw n;i=n}if(P.has(i.message))throw i;r<M&&await new Promise(n=>setTimeout(n,500*Math.pow(2,r)))}throw i||new Error("\u5206\u7247\u91CD\u8BD5\u8017\u5C3D")}async function S(t,e,d){return(await k.post(window.$A.apiUrl(t),e,{headers:{...R(),"Content-Type":"application/json"},signal:d})).data}function R(){return{token:D.state.userToken,language:O,platform:window.$A.Platform,version:window.systemInfo&&window.systemInfo.version||"0.0.1",fd:window.$A.getSessionStorageString("userWsFd")}}async function B(t,e,d){const a=new x.ArrayBuffer,i=2*1024*1024;for(let r=0;r<t.size;r+=i){if(e&&e.aborted)throw new Error("aborted");const n=Math.min(r+i,t.size),o=await t.slice(r,n).arrayBuffer();a.append(o),d(n,t.size),await new Promise(w=>setTimeout(w,0))}return a.end().toLowerCase()}function F(t,e,d){try{const a={upload_id:e,scene:d,t:Date.now()};localStorage.setItem(C+t,JSON.stringify(a))}catch{}}function X(t){try{localStorage.removeItem(C+t)}catch{}}export{j as C,G as c}; import{a as k}from"./axios.37c7f908.js";import{S as x}from"./spark-md5.0443325f.js";import{s as D,l as O}from"./app.818b057c.js";const j=10*1024*1024,U=3,M=3,C="chunked_upload:",P=new Set(["\u4E0A\u4F20\u4F1A\u8BDD\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F","\u4E0A\u4F20\u4F1A\u8BDD\u5F52\u5C5E\u9519\u8BEF","\u5206\u7247\u5E8F\u53F7\u8D85\u51FA\u8303\u56F4","\u5206\u7247\u5927\u5C0F\u4E0D\u7B26\u5408\u9884\u671F","\u672B\u5C3E\u5206\u7247\u5927\u5C0F\u4E0D\u7B26\u5408\u9884\u671F"]);function H(t,e){return t==="hashing"?Math.round(e*.05):t==="uploading"?5+Math.round(e*.9):95+Math.round(e*.05)}async function G({file:t,scene:e,sceneParams:d={},onProgress:a,onStart:i,signal:r}){const n=typeof a=="function"?a:()=>{},o=(s,h)=>n(H(s,h),s);o("hashing",0);const w=await B(t,r,(s,h)=>{o("hashing",Math.min(99,Math.round(s/h*100)))});if(o("hashing",100),r&&r.aborted)throw new Error("aborted");const c=await S("upload/init",{hash:w,size:t.size,name:t.name,scene:e,scene_params:d},r);if(c.ret!==1)throw new Error(c.msg||"\u4E0A\u4F20\u521D\u59CB\u5316\u5931\u8D25");if(c.data&&c.data.done)return o("uploading",100),o("merging",100),c.data;const{upload_id:p,chunk_size:l,chunk_count:g,received:A}=c.data;if(F(w,p,e),typeof i=="function")try{i(p)}catch{}const y=new Set((A||[]).map(Number)),f=[];for(let s=0;s<g;s++)y.has(s)||f.push(s);let E=y.size;const b=()=>{o("uploading",Math.min(99,Math.round(E/g*100)))};b();let N=0,u=null;const z=async()=>{for(;;){if(u)return;if(r&&r.aborted){u=new Error("aborted");return}const s=N++;if(s>=f.length)return;const h=f[s],_=h*l,L=Math.min(_+l,t.size),T=t.slice(_,L);try{await $(p,h,T,r),E++,b()}catch(v){u||(u=v);return}}},I=Math.min(U,f.length||1);if(await Promise.all(Array.from({length:I},()=>z())),u)throw u;o("uploading",100),o("merging",0);const m=await S("upload/merge",{upload_id:p},r);if(m.ret!==1)throw new Error(m.msg||"\u5408\u5E76\u5931\u8D25");return o("merging",100),X(w),m.data}async function $(t,e,d,a){let i;for(let r=0;r<=M;r++){if(a&&a.aborted)throw new Error("aborted");try{const n=new FormData;n.append("upload_id",t),n.append("index",String(e)),n.append("blob",d);const o=await k.post(window.$A.apiUrl("upload/chunk"),n,{headers:R(),signal:a});if(o.data&&o.data.ret===1)return o.data.data;i=new Error(o.data&&o.data.msg||"\u5206\u7247\u4E0A\u4F20\u5931\u8D25")}catch(n){if(a&&a.aborted)throw n;i=n}if(P.has(i.message))throw i;r<M&&await new Promise(n=>setTimeout(n,500*Math.pow(2,r)))}throw i||new Error("\u5206\u7247\u91CD\u8BD5\u8017\u5C3D")}async function S(t,e,d){return(await k.post(window.$A.apiUrl(t),e,{headers:{...R(),"Content-Type":"application/json"},signal:d})).data}function R(){return{token:D.state.userToken,language:O,platform:window.$A.Platform,version:window.systemInfo&&window.systemInfo.version||"0.0.1",fd:window.$A.getSessionStorageString("userWsFd")}}async function B(t,e,d){const a=new x.ArrayBuffer,i=2*1024*1024;for(let r=0;r<t.size;r+=i){if(e&&e.aborted)throw new Error("aborted");const n=Math.min(r+i,t.size),o=await t.slice(r,n).arrayBuffer();a.append(o),d(n,t.size),await new Promise(w=>setTimeout(w,0))}return a.end().toLowerCase()}function F(t,e,d){try{const a={upload_id:e,scene:d,t:Date.now()};localStorage.setItem(C+t,JSON.stringify(a))}catch{}}function X(t){try{localStorage.removeItem(C+t)}catch{}}export{j as C,G as c};

File diff suppressed because one or more lines are too long

1
public/js/build/dashboard.a79ba6ba.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.dashboard-icon[data-v-7ff1ad89]{display:inline-block;flex-shrink:0;-o-object-fit:contain;object-fit:contain;vertical-align:middle}.dashboard-priority-chart[data-v-104a8125]{position:relative;width:180px;height:180px;flex:0 0 180px}.priority-chart-canvas[data-v-104a8125]{position:absolute;top:-12px;left:-12px;width:204px;height:204px}.priority-chart-total[data-v-104a8125]{position:absolute;inset:36px 24px;display:flex;flex-direction:column;justify-content:center;align-items:center;pointer-events:none;color:#666;font-size:14px;text-align:center}.priority-chart-total strong[data-v-104a8125]{max-width:100%;font-size:40px;line-height:1.2;color:#2a2b2d;overflow-wrap:anywhere}.priority-chart-total .total-long[data-v-104a8125]{font-size:24px}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{n as l}from"./app.61df582b.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var m=function(){var t=this,r=t.$createElement,i=t._self._c||r;return i("div",{staticClass:"setting-device"},[i("ul",[t.loadIng>0&&t.devices.length===0?i("li",{staticClass:"loading"},[i("Loading")],1):t._l(t.devices,function(e){return i("li",{key:e.id},[i("div",{staticClass:"icon"},[i("span",{class:t.getIcon(e.detail)})]),i("div",{staticClass:"info"},[i("div",{staticClass:"title"},[i("span",{staticClass:"name"},[t._v(t._s(t.getName(e.detail)))]),i("span",{staticClass:"device"},[t._v(t._s(t.getOs(e.detail)))])]),i("div",{staticClass:"time"},[i("EPopover",{attrs:{placement:"bottom-start",trigger:"click"}},[i("div",{staticClass:"setting-device-popover"},[i("p",[t._v(t._s(t.$L("\u767B\u5F55\u65F6\u95F4"))+": "+t._s(e.created_at))]),i("p",[t._v(t._s(t.$L("\u66F4\u65B0\u65F6\u95F4"))+": "+t._s(e.updated_at))]),i("p",[t._v(t._s(t.$L("\u8FC7\u671F\u65F6\u95F4"))+": "+t._s(e.expired_at))])]),i("span",{attrs:{slot:"reference"},slot:"reference"},[t._v(t._s(e.updated_at))])])],1)]),i("div",[e.is_current?i("span",{staticClass:"current"},[t._v(t._s(t.$L("\u5F53\u524D\u8BBE\u5907")))]):i("Button",{on:{click:function(o){return t.onLogout(e)}}},[t._v(t._s(t.$L("\u9000\u51FA\u767B\u5F55")))])],1)])})],2)])},p=[];const c={name:"SettingDevice",data(){return{loadIng:0,devices:[]}},mounted(){this.getDeviceList()},methods:{getDeviceList(){this.loadIng++,this.$store.dispatch("call",{url:"users/device/list"}).then(({data:t})=>{this.devices=t.list,typeof this.$parent.updateDeviceCount=="function"&&this.$parent.updateDeviceCount(this.devices.length)}).catch(({msg:t})=>{$A.modalError(t),this.devices=[]}).finally(()=>{this.loadIng--})},getIcon({app_type:t,app_name:r}){return/ios/i.test(t)?/ipad/i.test(r)?"tablet":/iphone/i.test(r)?"phone":"apple":/android/i.test(t)?/(tablet|phablet)/i.test(r)?"tablet":"android":/mac/i.test(t)?"macos":/win/i.test(t)?"window":"web"},getName({app_brand:t,app_model:r,device_name:i,app_type:e,app_name:o,browser:a}){const s=[];if(/web/i.test(e))s.push(a,this.$L("\u6D4F\u89C8\u5668"));else{if(i)return i;t?s.push(t,r):s.push(o||e,this.$L("\u5BA2\u6237\u7AEF"))}return s.join(" ")},getOs({app_os:t,os:r}){return t||r},onLogout(t){$A.modalConfirm({title:"\u9000\u51FA\u767B\u5F55",content:"\u662F\u5426\u5728\u8BE5\u8BBE\u5907\u4E0A\u9000\u51FA\u767B\u5F55\uFF1F",loading:!0,onOk:()=>new Promise((r,i)=>{this.$store.dispatch("call",{url:"users/device/logout",data:{id:t.id}}).then(({msg:e})=>{r(e),this.getDeviceList()}).catch(({msg:e})=>{i(e)})})})}}},n={};var u=l(c,m,p,!1,d,null,null,null);function d(t){for(let r in n)this[r]=n[r]}var nt=function(){return u.exports}();export{nt as default}; import{n as l}from"./app.818b057c.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var m=function(){var t=this,r=t.$createElement,i=t._self._c||r;return i("div",{staticClass:"setting-device"},[i("ul",[t.loadIng>0&&t.devices.length===0?i("li",{staticClass:"loading"},[i("Loading")],1):t._l(t.devices,function(e){return i("li",{key:e.id},[i("div",{staticClass:"icon"},[i("span",{class:t.getIcon(e.detail)})]),i("div",{staticClass:"info"},[i("div",{staticClass:"title"},[i("span",{staticClass:"name"},[t._v(t._s(t.getName(e.detail)))]),i("span",{staticClass:"device"},[t._v(t._s(t.getOs(e.detail)))])]),i("div",{staticClass:"time"},[i("EPopover",{attrs:{placement:"bottom-start",trigger:"click"}},[i("div",{staticClass:"setting-device-popover"},[i("p",[t._v(t._s(t.$L("\u767B\u5F55\u65F6\u95F4"))+": "+t._s(e.created_at))]),i("p",[t._v(t._s(t.$L("\u66F4\u65B0\u65F6\u95F4"))+": "+t._s(e.updated_at))]),i("p",[t._v(t._s(t.$L("\u8FC7\u671F\u65F6\u95F4"))+": "+t._s(e.expired_at))])]),i("span",{attrs:{slot:"reference"},slot:"reference"},[t._v(t._s(e.updated_at))])])],1)]),i("div",[e.is_current?i("span",{staticClass:"current"},[t._v(t._s(t.$L("\u5F53\u524D\u8BBE\u5907")))]):i("Button",{on:{click:function(o){return t.onLogout(e)}}},[t._v(t._s(t.$L("\u9000\u51FA\u767B\u5F55")))])],1)])})],2)])},p=[];const c={name:"SettingDevice",data(){return{loadIng:0,devices:[]}},mounted(){this.getDeviceList()},methods:{getDeviceList(){this.loadIng++,this.$store.dispatch("call",{url:"users/device/list"}).then(({data:t})=>{this.devices=t.list,typeof this.$parent.updateDeviceCount=="function"&&this.$parent.updateDeviceCount(this.devices.length)}).catch(({msg:t})=>{$A.modalError(t),this.devices=[]}).finally(()=>{this.loadIng--})},getIcon({app_type:t,app_name:r}){return/ios/i.test(t)?/ipad/i.test(r)?"tablet":/iphone/i.test(r)?"phone":"apple":/android/i.test(t)?/(tablet|phablet)/i.test(r)?"tablet":"android":/mac/i.test(t)?"macos":/win/i.test(t)?"window":"web"},getName({app_brand:t,app_model:r,device_name:i,app_type:e,app_name:o,browser:a}){const s=[];if(/web/i.test(e))s.push(a,this.$L("\u6D4F\u89C8\u5668"));else{if(i)return i;t?s.push(t,r):s.push(o||e,this.$L("\u5BA2\u6237\u7AEF"))}return s.join(" ")},getOs({app_os:t,os:r}){return t||r},onLogout(t){$A.modalConfirm({title:"\u9000\u51FA\u767B\u5F55",content:"\u662F\u5426\u5728\u8BE5\u8BBE\u5907\u4E0A\u9000\u51FA\u767B\u5F55\uFF1F",loading:!0,onOk:()=>new Promise((r,i)=>{this.$store.dispatch("call",{url:"users/device/logout",data:{id:t.id}}).then(({msg:e})=>{r(e),this.getDeviceList()}).catch(({msg:e})=>{i(e)})})})}}},n={};var u=l(c,m,p,!1,d,null,null,null);function d(t){for(let r in n)this[r]=n[r]}var nt=function(){return u.exports}();export{nt as default};

View File

@ -1 +1 @@
import{D as p}from"./DialogWrapper.3c680ae9.js";import{m}from"./vuex.cc7cb26e.js";import{n as a}from"./app.61df582b.js";import"./chunkedUpload.f6cef7c7.js";import"./axios.37c7f908.js";import"./spark-md5.0443325f.js";import"./index.0e9ced87.js";import"./vue-virtual-scroll-list-hi.74ad83f0.js";import"./@babel.9410f858.js";import"./vue.adba9046.js";import"./lodash.8fcd6fd4.js";import"./ImgUpload.595f2641.js";import"./webhook.378987f3.js";import"./jquery.c18cbaba.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./openpgp_hi.15f91b1d.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var e=function(){var t=this,o=t.$createElement,r=t._self._c||o;return r("div",{staticClass:"electron-dialog"},[r("PageTitle",{attrs:{title:t.dialogData.name}}),t.dialogId>0?r("DialogWrapper",{attrs:{dialogId:t.dialogId}}):t._e()],1)},n=[];const s={components:{DialogWrapper:p},computed:{...m(["cacheDialogs"]),dialogId(){const{dialogId:t}=this.$route.params;return parseInt(/^\d+$/.test(t)?t:0)},dialogData(){return this.cacheDialogs.find(({id:t})=>t===this.dialogId)||{}}}},i={};var l=a(s,e,n,!1,d,"4f6d7c8a",null,null);function d(t){for(let o in i)this[o]=i[o]}var dt=function(){return l.exports}();export{dt as default}; import{D as p}from"./DialogWrapper.21630cce.js";import{m}from"./vuex.cc7cb26e.js";import{n as a}from"./app.818b057c.js";import"./chunkedUpload.a9ef725e.js";import"./axios.37c7f908.js";import"./spark-md5.0443325f.js";import"./index.ab4b7604.js";import"./vue-virtual-scroll-list-hi.74ad83f0.js";import"./@babel.9410f858.js";import"./vue.adba9046.js";import"./lodash.8fcd6fd4.js";import"./ImgUpload.a99f26bd.js";import"./webhook.378987f3.js";import"./jquery.c87f487f.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./openpgp_hi.15f91b1d.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var e=function(){var t=this,o=t.$createElement,r=t._self._c||o;return r("div",{staticClass:"electron-dialog"},[r("PageTitle",{attrs:{title:t.dialogData.name}}),t.dialogId>0?r("DialogWrapper",{attrs:{dialogId:t.dialogId}}):t._e()],1)},n=[];const s={components:{DialogWrapper:p},computed:{...m(["cacheDialogs"]),dialogId(){const{dialogId:t}=this.$route.params;return parseInt(/^\d+$/.test(t)?t:0)},dialogData(){return this.cacheDialogs.find(({id:t})=>t===this.dialogId)||{}}}},i={};var l=a(s,e,n,!1,d,"4f6d7c8a",null,null);function d(t){for(let o in i)this[o]=i[o]}var dt=function(){return l.exports}();export{dt as default};

9
public/js/build/echarts.523e56b1.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import n from"./FileContent.c92b6a0e.js";import m from"./FilePreview.bab63267.js";import{n as l}from"./app.61df582b.js";import"./openpgp_hi.15f91b1d.js";import"./IFrame.c096b4d0.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var s=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"single-file"},[i("PageTitle",{attrs:{title:t.pageName}}),t.loadIng>0?i("Loading"):t.fileInfo?[t.isPreview?i("FilePreview",{attrs:{code:t.code,file:t.fileInfo,historyId:t.historyId,headerShow:!t.$isEEUIApp}}):i("FileContent",{attrs:{file:t.fileInfo},model:{value:t.fileShow,callback:function(r){t.fileShow=r},expression:"fileShow"}})]:t._e()],2)},p=[];const a={components:{FilePreview:m,FileContent:n},data(){return{loadIng:0,code:null,fileShow:!0,fileInfo:null}},mounted(){},computed:{historyId(){return this.$route.query?$A.runNum(this.$route.query.history_id):0},isPreview(){return this.windowPortrait||this.code||this.historyId>0||this.fileInfo&&this.fileInfo.permission===0},pageName(){return this.$route.query&&this.$route.query.history_title?this.$route.query.history_title:this.fileInfo?`${this.fileInfo.name} [${this.fileInfo.created_at}]`:""}},watch:{$route:{handler(){this.getInfo()},immediate:!0}},methods:{getInfo(){let{codeOrFileId:t}=this.$route.params,e={id:t};if(/^\d+$/.test(t))this.code=null;else if(t)this.code=t;else return;setTimeout(i=>{this.loadIng++},600),this.$store.dispatch("call",{url:"file/one",data:e}).then(({data:i})=>{this.fileInfo=i}).catch(({msg:i})=>{$A.modalError({content:i,onOk:()=>{window.close()}})}).finally(i=>{this.loadIng--})}}},o={};var f=l(a,s,p,!1,u,"662d0b64",null,null);function u(t){for(let e in o)this[e]=o[e]}var st=function(){return f.exports}();export{st as default}; import n from"./FileContent.9635e5fc.js";import m from"./FilePreview.f5f37123.js";import{n as l}from"./app.818b057c.js";import"./openpgp_hi.15f91b1d.js";import"./IFrame.7112b2ed.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var s=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"single-file"},[i("PageTitle",{attrs:{title:t.pageName}}),t.loadIng>0?i("Loading"):t.fileInfo?[t.isPreview?i("FilePreview",{attrs:{code:t.code,file:t.fileInfo,historyId:t.historyId,headerShow:!t.$isEEUIApp}}):i("FileContent",{attrs:{file:t.fileInfo},model:{value:t.fileShow,callback:function(r){t.fileShow=r},expression:"fileShow"}})]:t._e()],2)},p=[];const a={components:{FilePreview:m,FileContent:n},data(){return{loadIng:0,code:null,fileShow:!0,fileInfo:null}},mounted(){},computed:{historyId(){return this.$route.query?$A.runNum(this.$route.query.history_id):0},isPreview(){return this.windowPortrait||this.code||this.historyId>0||this.fileInfo&&this.fileInfo.permission===0},pageName(){return this.$route.query&&this.$route.query.history_title?this.$route.query.history_title:this.fileInfo?`${this.fileInfo.name} [${this.fileInfo.created_at}]`:""}},watch:{$route:{handler(){this.getInfo()},immediate:!0}},methods:{getInfo(){let{codeOrFileId:t}=this.$route.params,e={id:t};if(/^\d+$/.test(t))this.code=null;else if(t)this.code=t;else return;setTimeout(i=>{this.loadIng++},600),this.$store.dispatch("call",{url:"file/one",data:e}).then(({data:i})=>{this.fileInfo=i}).catch(({msg:i})=>{$A.modalError({content:i,onOk:()=>{window.close()}})}).finally(i=>{this.loadIng--})}}},o={};var f=l(a,s,p,!1,u,"662d0b64",null,null);function u(t){for(let e in o)this[e]=o[e]}var st=function(){return f.exports}();export{st as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{_ as m}from"./openpgp_hi.15f91b1d.js";import{e as n}from"./index.40a8e116.js";import{n as p}from"./app.61df582b.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var a=function(){var t=this,o=t.$createElement,i=t._self._c||o;return t.ready?i("VEditor",{attrs:{leftToolbar:t.leftToolbar,rightToolbar:t.rightToolbar,tocNavPositionRight:t.tocNavPositionRight,includeLevel:t.includeLevel},model:{value:t.content,callback:function(e){t.content=e},expression:"content"}}):i("Loading")},s=[];const l={name:"VMEditor",mixins:[n],components:{VEditor:()=>m(()=>import("./editor.e608e86f.js"),["js/build/editor.e608e86f.js","js/build/editor.2d3fffc9.css","js/build/@kangc.b5fe0a56.js","js/build/@kangc.d8464d83.css","js/build/@babel.9410f858.js","js/build/vue.adba9046.js","js/build/copy-to-clipboard.a53c061d.js","js/build/toggle-selection.d2487283.js","js/build/prismjs.94ec9288.js","js/build/app.61df582b.js","js/build/app.c9909b0e.css","js/build/jquery.c18cbaba.js","js/build/dayjs.385b6e3c.js","js/build/localforage.9c0dced8.js","js/build/markdown-it.0450edb4.js","js/build/mdurl.ce6c1dd8.js","js/build/uc.micro.8d343c98.js","js/build/entities.48a44fec.js","js/build/linkify-it.c5e8196e.js","js/build/punycode.js.4b3f125a.js","js/build/highlight.js.cbbfb885.js","js/build/markdown-it-link-attributes.e1d5d151.js","js/build/@traptitech.acea8861.js","js/build/vuex.cc7cb26e.js","js/build/openpgp_hi.15f91b1d.js","js/build/axios.37c7f908.js","js/build/mitt.1ea0a2a3.js","js/build/quill-hi.ca2ea0cc.js","js/build/parchment.d5c5924e.js","js/build/quill-delta.385a10bf.js","js/build/fast-diff.f17881f3.js","js/build/lodash.clonedeep.3cc09a31.js","js/build/lodash.isequal.dbdc2157.js","js/build/eventemitter3.78b735ad.js","js/build/lodash-es.76e3a28b.js","js/build/quill-mention-hi.4eeb5a2d.js","js/build/view-design-hi.f1128b4d.js","js/build/html-to-md.f297036e.js","js/build/lodash.8fcd6fd4.js","js/build/vue-router.2d566cd7.js","js/build/vue-clipboard2.fd43a5bc.js","js/build/clipboard.37b37361.js","js/build/vuedraggable.f464b992.js","js/build/sortablejs.3488b922.js","js/build/vue-resize-observer.5af23a43.js","js/build/element-sea.f8a64907.js","js/build/deepmerge.cecf392e.js","js/build/resize-observer-polyfill.5d591c5f.js","js/build/throttle-debounce.7c3948b2.js","js/build/babel-helper-vue-jsx-merge-props.5ed215c3.js","js/build/normalize-wheel.2a034b9f.js","js/build/async-validator.dca2b951.js","js/build/babel-runtime.4773988a.js","js/build/core-js.314b4a1d.js","js/build/codemirror.9d10b9e4.js","js/build/codemirror.9ace6687.css","js/build/index.40a8e116.js","js/build/ImgUpload.595f2641.js","js/build/chunkedUpload.f6cef7c7.js","js/build/spark-md5.0443325f.js"])},data(){return{ready:!1,content:""}},async mounted(){await $A.loadScriptS(["js/katex/katex.min.js","js/katex/katex.min.css","js/mermaid.min.js"]),this.ready=!0},watch:{value:{handler(t){t==null&&(t=""),this.content=t},immediate:!0},content(t){this.$emit("input",t)}}},r={};var c=p(l,a,s,!1,_,null,null,null);function _(t){for(let o in r)this[o]=r[o]}var nt=function(){return c.exports}();export{nt as default}; import{_ as m}from"./openpgp_hi.15f91b1d.js";import{e as n}from"./index.40a8e116.js";import{n as p}from"./app.818b057c.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var a=function(){var t=this,o=t.$createElement,i=t._self._c||o;return t.ready?i("VEditor",{attrs:{leftToolbar:t.leftToolbar,rightToolbar:t.rightToolbar,tocNavPositionRight:t.tocNavPositionRight,includeLevel:t.includeLevel},model:{value:t.content,callback:function(e){t.content=e},expression:"content"}}):i("Loading")},s=[];const l={name:"VMEditor",mixins:[n],components:{VEditor:()=>m(()=>import("./editor.fa7aa67f.js"),["js/build/editor.fa7aa67f.js","js/build/editor.2d3fffc9.css","js/build/@kangc.b5fe0a56.js","js/build/@kangc.d8464d83.css","js/build/@babel.9410f858.js","js/build/vue.adba9046.js","js/build/copy-to-clipboard.a53c061d.js","js/build/toggle-selection.d2487283.js","js/build/prismjs.94ec9288.js","js/build/app.818b057c.js","js/build/app.e77c9e40.css","js/build/jquery.c87f487f.js","js/build/dayjs.fd4aa75c.js","js/build/localforage.8de7c27e.js","js/build/markdown-it.0450edb4.js","js/build/mdurl.ce6c1dd8.js","js/build/uc.micro.8d343c98.js","js/build/entities.48a44fec.js","js/build/linkify-it.c5e8196e.js","js/build/punycode.js.4b3f125a.js","js/build/highlight.js.cbbfb885.js","js/build/markdown-it-link-attributes.e1d5d151.js","js/build/@traptitech.acea8861.js","js/build/vuex.cc7cb26e.js","js/build/openpgp_hi.15f91b1d.js","js/build/axios.37c7f908.js","js/build/mitt.1ea0a2a3.js","js/build/quill-hi.ca2ea0cc.js","js/build/parchment.d5c5924e.js","js/build/quill-delta.385a10bf.js","js/build/fast-diff.f17881f3.js","js/build/lodash.clonedeep.3cc09a31.js","js/build/lodash.isequal.dbdc2157.js","js/build/eventemitter3.78b735ad.js","js/build/lodash-es.76e3a28b.js","js/build/quill-mention-hi.4eeb5a2d.js","js/build/view-design-hi.24419422.js","js/build/html-to-md.f297036e.js","js/build/lodash.8fcd6fd4.js","js/build/vue-router.2d566cd7.js","js/build/vue-clipboard2.fd43a5bc.js","js/build/clipboard.37b37361.js","js/build/vuedraggable.f464b992.js","js/build/sortablejs.3488b922.js","js/build/vue-resize-observer.5af23a43.js","js/build/element-sea.f8a64907.js","js/build/deepmerge.cecf392e.js","js/build/resize-observer-polyfill.5d591c5f.js","js/build/throttle-debounce.7c3948b2.js","js/build/babel-helper-vue-jsx-merge-props.5ed215c3.js","js/build/normalize-wheel.2a034b9f.js","js/build/async-validator.dca2b951.js","js/build/babel-runtime.4773988a.js","js/build/core-js.314b4a1d.js","js/build/codemirror.9d10b9e4.js","js/build/codemirror.9ace6687.css","js/build/index.40a8e116.js","js/build/ImgUpload.a99f26bd.js","js/build/chunkedUpload.a9ef725e.js","js/build/spark-md5.0443325f.js"])},data(){return{ready:!1,content:""}},async mounted(){await $A.loadScriptS(["js/katex/katex.min.js","js/katex/katex.min.css","js/mermaid.min.js"]),this.ready=!0},watch:{value:{handler(t){t==null&&(t=""),this.content=t},immediate:!0},content(t){this.$emit("input",t)}}},r={};var c=p(l,a,s,!1,_,null,null,null);function _(t){for(let o in r)this[o]=r[o]}var nt=function(){return c.exports}();export{nt as default};

File diff suppressed because one or more lines are too long

1
public/js/build/index.a8a8b23a.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{n as m}from"./app.61df582b.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var e=function(){var t=this,o=t.$createElement,i=t._self._c||o;return i("div")},n=[];const p={data(){return{}},mounted(){if(/^https?:/i.test(window.location.protocol)){let t=null;if(this.$router.mode==="hash"?$A.stringLength(window.location.pathname)>2&&(t=`${window.location.origin}/#${window.location.pathname}${window.location.search}`):this.$router.mode==="history"&&$A.strExists(window.location.href,"/#/")&&(t=window.location.href.replace("/#/","/")),t)throw this.$store.dispatch("userUrl",t).then(o=>{window.location.href=o}),SyntaxError()}},activated(){this.start()},methods:{start(){this.userId>0?this.goForward({name:"manage-dashboard"},!0):this.goForward({name:"login"},!0)}}},r={};var a=m(p,e,n,!1,s,null,null,null);function s(t){for(let o in r)this[o]=r[o]}var rt=function(){return a.exports}();export{rt as default}; import{n as m}from"./app.818b057c.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var e=function(){var t=this,o=t.$createElement,i=t._self._c||o;return i("div")},n=[];const p={data(){return{}},mounted(){if(/^https?:/i.test(window.location.protocol)){let t=null;if(this.$router.mode==="hash"?$A.stringLength(window.location.pathname)>2&&(t=`${window.location.origin}/#${window.location.pathname}${window.location.search}`):this.$router.mode==="history"&&$A.strExists(window.location.href,"/#/")&&(t=window.location.href.replace("/#/","/")),t)throw this.$store.dispatch("userUrl",t).then(o=>{window.location.href=o}),SyntaxError()}},activated(){this.start()},methods:{start(){this.userId>0?this.goForward({name:"manage-dashboard"},!0):this.goForward({name:"login"},!0)}}},r={};var a=m(p,e,n,!1,s,null,null,null);function s(t){for(let o in r)this[o]=r[o]}var rt=function(){return a.exports}();export{rt as default};

1
public/js/build/keyboard.04777b47.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/js/build/keyboard.654e75cb.css vendored Normal file
View File

@ -0,0 +1 @@
.input-box[data-v-26eb7086]{display:flex;align-items:center}.input-box .input-box-push[data-v-26eb7086]{opacity:.5;padding:0 12px 0 8px}.input-box .input-box-key[data-v-26eb7086]{width:60px}

View File

@ -1 +0,0 @@
.input-box[data-v-d8736ab0]{display:flex;align-items:center}.input-box .input-box-push[data-v-d8736ab0]{opacity:.5;padding:0 12px 0 8px}.input-box .input-box-key[data-v-d8736ab0]{width:60px}

View File

@ -1 +1 @@
import{g as e,l as n,q as s,n as p}from"./app.61df582b.js";import{m as l}from"./vuex.cc7cb26e.js";import"./jquery.c18cbaba.js";import"./@babel.9410f858.js";import"./dayjs.385b6e3c.js";import"./localforage.9c0dced8.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.f1128b4d.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var u=function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("div",{staticClass:"setting-item submit"},[r("Form",t._b({ref:"formData",attrs:{model:t.formData,rules:t.ruleData},nativeOn:{submit:function(o){o.preventDefault()}}},"Form",t.formOptions,!1),[r("FormItem",{attrs:{label:t.$L("\u9009\u62E9\u8BED\u8A00"),prop:"language"}},[r("Select",{attrs:{placeholder:t.$L("\u9009\u9879\u8BED\u8A00")},model:{value:t.formData.language,callback:function(o){t.$set(t.formData,"language",o)},expression:"formData.language"}},t._l(t.languageList,function(o,i){return r("Option",{key:i,attrs:{value:i}},[t._v(t._s(o))])}),1)],1)],1),r("div",{staticClass:"setting-footer"},[r("Button",{attrs:{loading:t.loadIng>0,type:"primary"},on:{click:t.submitForm}},[t._v(t._s(t.$L("\u63D0\u4EA4")))]),r("Button",{attrs:{loading:t.loadIng>0},on:{click:t.resetForm}},[t._v(t._s(t.$L("\u91CD\u7F6E")))])],1)],1)},f=[];const g={data(){return{loadIng:0,languageList:e,formData:{language:""},ruleData:{}}},mounted(){this.initData()},computed:{...l(["formOptions"])},methods:{initData(){this.$set(this.formData,"language",n),this.formData_bak=$A.cloneJSON(this.formData)},submitForm(){this.$refs.formData.validate(t=>{t&&s(this.formData.language)})},resetForm(){this.formData=$A.cloneJSON(this.formData_bak)}}},m={};var c=p(g,u,f,!1,_,null,null,null);function _(t){for(let a in m)this[a]=m[a]}var st=function(){return c.exports}();export{st as default}; import{g as e,l as n,q as s,n as p}from"./app.818b057c.js";import{m as l}from"./vuex.cc7cb26e.js";import"./jquery.c87f487f.js";import"./@babel.9410f858.js";import"./dayjs.fd4aa75c.js";import"./localforage.8de7c27e.js";import"./markdown-it.0450edb4.js";import"./mdurl.ce6c1dd8.js";import"./uc.micro.8d343c98.js";import"./entities.48a44fec.js";import"./linkify-it.c5e8196e.js";import"./punycode.js.4b3f125a.js";import"./highlight.js.cbbfb885.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.acea8861.js";import"./vue.adba9046.js";import"./openpgp_hi.15f91b1d.js";import"./axios.37c7f908.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.ca2ea0cc.js";import"./parchment.d5c5924e.js";import"./quill-delta.385a10bf.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.3cc09a31.js";import"./lodash.isequal.dbdc2157.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.76e3a28b.js";import"./quill-mention-hi.4eeb5a2d.js";import"./view-design-hi.24419422.js";import"./html-to-md.f297036e.js";import"./lodash.8fcd6fd4.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.fd43a5bc.js";import"./clipboard.37b37361.js";import"./vuedraggable.f464b992.js";import"./sortablejs.3488b922.js";import"./vue-resize-observer.5af23a43.js";import"./element-sea.f8a64907.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.5d591c5f.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.dca2b951.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var u=function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("div",{staticClass:"setting-item submit"},[r("Form",t._b({ref:"formData",attrs:{model:t.formData,rules:t.ruleData},nativeOn:{submit:function(o){o.preventDefault()}}},"Form",t.formOptions,!1),[r("FormItem",{attrs:{label:t.$L("\u9009\u62E9\u8BED\u8A00"),prop:"language"}},[r("Select",{attrs:{placeholder:t.$L("\u9009\u9879\u8BED\u8A00")},model:{value:t.formData.language,callback:function(o){t.$set(t.formData,"language",o)},expression:"formData.language"}},t._l(t.languageList,function(o,i){return r("Option",{key:i,attrs:{value:i}},[t._v(t._s(o))])}),1)],1)],1),r("div",{staticClass:"setting-footer"},[r("Button",{attrs:{loading:t.loadIng>0,type:"primary"},on:{click:t.submitForm}},[t._v(t._s(t.$L("\u63D0\u4EA4")))]),r("Button",{attrs:{loading:t.loadIng>0},on:{click:t.resetForm}},[t._v(t._s(t.$L("\u91CD\u7F6E")))])],1)],1)},f=[];const g={data(){return{loadIng:0,languageList:e,formData:{language:""},ruleData:{}}},mounted(){this.initData()},computed:{...l(["formOptions"])},methods:{initData(){this.$set(this.formData,"language",n),this.formData_bak=$A.cloneJSON(this.formData)},submitForm(){this.$refs.formData.validate(t=>{t&&s(this.formData.language)})},resetForm(){this.formData=$A.cloneJSON(this.formData_bak)}}},m={};var c=p(g,u,f,!1,_,null,null,null);function _(t){for(let a in m)this[a]=m[a]}var st=function(){return c.exports}();export{st as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/js/build/login.f525c424.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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