mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-13 20:12:48 +00:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6eb08ac09b | ||
|
|
20fc2b073b | ||
|
|
8c4b9e8d12 | ||
|
|
8d187f5cfc | ||
|
|
db07a96e97 | ||
|
|
7acc9227ff | ||
|
|
c3a71e5b07 | ||
|
|
ac9e1e5e67 | ||
|
|
c668340661 | ||
|
|
ee9b6248bb | ||
|
|
01c7f7250b | ||
|
|
2abc5976f9 | ||
|
|
3e468c74e4 | ||
|
|
4ef78d2c81 | ||
|
|
4621222fa3 | ||
|
|
be860f9968 | ||
|
|
fe0b8aed20 | ||
|
|
f0e844c308 | ||
|
|
6a7cc95b23 | ||
|
|
7fd90b9ceb | ||
|
|
43577073e6 | ||
|
|
faeeb09a4a | ||
|
|
d88349b6f7 | ||
|
|
ff53e1fac3 | ||
|
|
cf4894b7c3 | ||
|
|
678dfd2d5c | ||
|
|
bf4a62ae04 | ||
|
|
7e6f3f92cf | ||
|
|
df382dafb4 | ||
|
|
10925d3a47 | ||
|
|
66252072c7 | ||
|
|
29918882bd | ||
|
|
4983fe8feb | ||
|
|
f65da118d7 | ||
|
|
a86bd9a05e | ||
|
|
f2719eb742 | ||
|
|
4f9ee1dfa9 | ||
|
|
e6ad1218bc | ||
|
|
dd2cd1df9a |
4
.gitignore
vendored
4
.gitignore
vendored
@ -23,6 +23,9 @@
|
||||
vars.yaml
|
||||
|
||||
# IDE and editor files
|
||||
.cursor/*
|
||||
!.cursor/rules/
|
||||
!.cursor/rules/**
|
||||
.idea
|
||||
.vscode
|
||||
.windsurfrules
|
||||
@ -57,5 +60,4 @@ laravels.pid
|
||||
.DS_Store
|
||||
|
||||
# Documentation
|
||||
AGENTS.md
|
||||
README_LOCAL.md
|
||||
|
||||
127
AGENTS.md
Normal file
127
AGENTS.md
Normal file
@ -0,0 +1,127 @@
|
||||
# DooTask 项目说明
|
||||
|
||||
## 一、项目总览
|
||||
|
||||
- **项目定位**:DooTask 是一套开源的任务 / 项目管理系统,支持看板、任务、子任务、评论、对话、文件、报表等协作能力。
|
||||
- **后端技术栈**
|
||||
- 基于 Laravel(运行在 LaravelS / Swoole 常驻进程上),代码集中在 `app/`、`routes/`、`config/` 等目录。
|
||||
- 数据库通过 Laravel Eloquent 模型访问,所有表结构变更必须通过 migration 完成,禁止直接手工改库。
|
||||
- **前端技术栈**
|
||||
- 主 Web 前端基于 Vue2 + Vite,代码集中在 `resources/assets/js`。
|
||||
- 打包与开发通过根目录的 `./cmd` 脚本间接调用 Vite。
|
||||
- **桌面端**
|
||||
- 使用 Electron 作为桌面壳,核心业务逻辑仍在 Web 前端与 Laravel 后端中。
|
||||
|
||||
更多安装、升级、迁移说明见根目录 `README.md`。
|
||||
|
||||
## 二、开发与运行(命令约定)
|
||||
|
||||
- 开发 / 构建命令统一通过根目录的 `./cmd` 脚本执行,以保证与 Docker / 容器环境一致:
|
||||
- 启动服务:`./cmd up`
|
||||
- 停止服务:`./cmd down`
|
||||
- 重启服务:`./cmd reup` 或 `./cmd restart`
|
||||
- Laravel 工具:`./cmd artisan ...`
|
||||
- 前端开发:`./cmd dev`
|
||||
- 前端构建:`./cmd prod` 或 `./cmd build`
|
||||
- 其他工具:`./cmd composer ...`、`./cmd php ...`、`./cmd doc` 等
|
||||
- 在示例、脚本与回答中,优先使用 `./cmd ...` 形式,而不是直接调用 `php`、`composer`、`npm` 等命令。
|
||||
|
||||
## 三、代码结构(后端 + 前端)
|
||||
|
||||
- **Controller(`app/Http/Controllers`)**
|
||||
- 负责路由入口、参数接收与基础校验,编排调用模型 / 模块,并组装 API 响应。
|
||||
- 原则:控制器尽量保持「薄」,复杂业务逻辑不要堆积在控制器中。
|
||||
- 业务异常优先使用 `App\Exceptions\ApiException` 抛出,由全局 Handler 统一转换为标准 JSON 响应。
|
||||
|
||||
- **Model(`app/Models`)**
|
||||
- 负责数据表结构映射、关系(relations)、访问器 / 修改器、自定义查询 Scope 等「数据层」逻辑。
|
||||
- 避免在模型方法中塞入大量跨业务的流程控制逻辑,复杂业务应下沉到模块中。
|
||||
|
||||
- **Module(`app/Module`)**
|
||||
- 承载跨控制器 / 跨模型的业务逻辑与独立功能子域,例如:
|
||||
- 外部服务集成:`AgoraIO/*`、`ZincSearch/*` 等;
|
||||
- 通用工具:`Lock.php`、`TextExtractor.php`、`Image.php` 等;
|
||||
- 项目 / 任务 / 对话等领域里的复杂协作逻辑。
|
||||
- 原则:
|
||||
- 新增较复杂的业务功能时,优先考虑创建 / 扩展 Module,而不是在 Controller 或 Model 中堆砌流程。
|
||||
- Module 尽量保持单一职责与可复用,命名能直接反映其业务或能力作用。
|
||||
|
||||
- **运行环境注意事项(LaravelS / Swoole)**
|
||||
- 避免在静态属性、单例、全局变量中存储请求级状态或可变数据,防止请求间数据串联和内存泄漏。
|
||||
- 不要假设构造函数、服务提供者或 `boot()` 方法会在每个请求重新执行;涉及配置、路由等改动时,通常需要通过 `./cmd php restart` 或容器重启后才能生效。
|
||||
- 编写长连接、定时任务、WebSocket 等长生命周期逻辑时,优先复用现有模式,并避免长时间阻塞协程 / 事件循环的操作。
|
||||
|
||||
- **前端(`resources/assets/js`,Vue2 + Vite)**
|
||||
- 结构大致包括:
|
||||
- `app.js`、`App.vue`:应用入口与根组件;
|
||||
- `components/`:通用与业务组件(任务看板、文件预览、聊天等);
|
||||
- `pages/`:页面级组件(登录、项目、任务视图、消息、报表等);
|
||||
- `store/`:Vuex 全局状态管理;
|
||||
- `routes.js`:前端路由配置。
|
||||
- 构建与开发:
|
||||
- 开发模式:使用 `./cmd dev` 或类似子命令,内部通过 Vite 启动开发服务器。
|
||||
- 生产构建:使用 `./cmd prod` 或 `./cmd build`,内部通过 Vite 产出前端静态资源。
|
||||
- 与后端接口协作:
|
||||
- 接口调用默认通过已有的 Vuex 封装发起请求,新增接口时优先扩展集中封装,而不是在组件中直接散落 `axios/fetch`。
|
||||
|
||||
- **Electron**
|
||||
- Electron 主要作为桌面入口壳,核心业务逻辑仍在 Web/Vue2 前端与 PHP/Laravel 后端。
|
||||
- 日常开发与调试优先使用 `./cmd electron ...`;需要构建 App 端资源时使用 `./cmd appbuild`。
|
||||
- 原则:优先保证 Web 端行为正确,再通过 Electron 壳复用 Web 逻辑;桌面专有能力(本地文件、托盘等)需在代码中明确边界。
|
||||
|
||||
## 四、在本项目中使用 Graphiti 作为长期记忆
|
||||
|
||||
- **角色与 group_id**
|
||||
- Graphiti 作为本项目的「长期记忆层」,用于持久化:
|
||||
- 用户偏好(Preferences)、工作流程 / 习惯(Procedures)、重要约束(Requirements)、关键事实 / 关系(Facts)。
|
||||
- 目标是:跨对话、跨任务保持一致的行为和决策,而不是简单堆积信息。
|
||||
- 本项目统一使用的 `group_id`:`dootask-main`。
|
||||
|
||||
- **任务开始前(读)**
|
||||
- 在进行实质性工作(写代码、设计方案、做大改动)前,应先通过 Graphiti 查询已有记忆:
|
||||
- 使用节点搜索(如 `search_nodes`)在 `group_id = "dootask-main"` 下查找与当前任务相关的 Preference / Procedure / Requirement;
|
||||
- 使用事实搜索(如 `search_facts`)查找相关事实与实体关系;
|
||||
- 查询语句中可包含:任务类型(Bug 修复 / 重构 / 新功能等)、涉及模块(任务、项目、对话、WebSocket、报表等)以及关键字 `dootask`。
|
||||
- 发现与当前任务高度相关的偏好 / 流程 / 约束时,应优先遵守;如存在冲突,应在回答中说明并做合理选择。
|
||||
|
||||
- **什么时候写入 Graphiti(写)**
|
||||
- **偏好(Preferences)**:用户表达持续性偏好时(语言、输出格式、技术选型等),应尽快写入;
|
||||
- **流程 / 习惯(Procedures)**:形成「以后都按这个流程来」的稳定开发 / 发布 / 调试流程时,应记录为可复用步骤;
|
||||
- **约束 / 决策(Requirements)**:项目长期有效的决策,如不再支持某版本、某模块的架构约定等;
|
||||
- **事实 / 关系(Facts)**:模块边界约定、服务之间的调用关系、与外部系统(如 AgoraIO、ZincSearch)集成方式等。
|
||||
- 写入建议:
|
||||
- 默认使用 `source: "text"`,在 `episode_body` 中用简洁结构化自然语言描述背景、类型、范围、具体内容;
|
||||
- 需要结构化数据时可用 `source: "json"`,保证 `episode_body` 是合法 JSON 字符串;
|
||||
- 所有写入默认使用 `group_id: "dootask-main"`。
|
||||
|
||||
- **更新与更正**
|
||||
- 偏好 / 流程发生变化时,新增一条 episode 说明新约定,并标明这是对旧习惯的更新,后续以最新、最明确的为准;
|
||||
- 用户要求「忘记」某些记忆时,可通过删除或更正相关 episode / 关系的方式处理;
|
||||
- 尽量通过新增 episode 记录「更正 / 废弃说明」,而不是直接改写历史事实。
|
||||
|
||||
- **在工作中的使用方式**
|
||||
- 尊重已存偏好:编码风格、回答结构、工具选择等应对齐已知偏好;
|
||||
- 遵循已有流程:若图谱中已有与当前任务匹配的 Procedure,应尽量按步骤执行;
|
||||
- 利用事实:理解系统行为、模块边界、历史决策时优先查已存 Facts,减少重新摸索;
|
||||
- 如 Graphiti 与当前代码实际冲突,应以代码实际为准,并视情况新增 episode 更新事实。
|
||||
|
||||
- **不要写入 Graphiti 的内容**
|
||||
- 含敏感信息(密钥、密码、隐私数据等);
|
||||
- 只与当前一次任务相关、未来不会复用的临时信息(调试日志、一次性命令输出等);
|
||||
- 体量巨大的原始数据(完整日志、长脚本全文等),应只存摘要和关键结论。
|
||||
|
||||
- **最佳实践小结**
|
||||
- 先查再做:在提出方案或改动架构前,优先查阅 Graphiti 中已有的设计、偏好和约束;
|
||||
- 能复用就沉淀:只要发现某个偏好 / 流程 / 约束未来会反复用到,就尽快写入 Graphiti,而不是只放在当前对话里;
|
||||
- 保持项目内外一致:确保 Graphiti 中的记忆与实际代码长期保持一致,避免「记忆漂移」。
|
||||
|
||||
## 五、前端弹窗文案
|
||||
|
||||
- 在前端 Vue 代码中调用 `$A.modalXXX`、`$A.messageXXX`、`$A.noticeXXX` 时,这些方法内部会统一处理 `$L` 翻译,调用方默认不要再额外包一层 `$L`。
|
||||
- 仅当 `modalXXX` 特殊场景显式传入 `language: false`(关闭内部自动翻译)时,才由调用方在传入前自行决定是否使用 `$L` 处理文案。
|
||||
|
||||
## 六、AI 回复风格与语言偏好
|
||||
|
||||
- 总体说明与重要总结(尤其是最终回答的 recap 部分),在不影响技术表达准确性的前提下,应优先使用简体中文进行回复。
|
||||
- 如用户在对话中明确要求使用其他语言(例如英文),则以用户的显式指令为最高优先级。
|
||||
- 当本次协作的改动已经较为完整且自然形成一个提交单元时,应在最终回答中附带一条或数条推荐的 Git 提交 message,方便用户直接复制使用。
|
||||
33
CHANGELOG.md
33
CHANGELOG.md
@ -2,6 +2,39 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [1.4.81]
|
||||
|
||||
### Features
|
||||
|
||||
- 优化周报、日报中已完成和未完成任务的统计规则,任务数据更准确。
|
||||
- 改进消息推送逻辑,并支持点击消息直接打开相关微应用,查看内容更便捷。
|
||||
- 更新内置应用商店版本,提升整体可用性和稳定性。
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- 修复任务导出时状态判断错误和状态高亮列错位的问题,导出结果更清晰。
|
||||
- 修复任务统计导出时,部分无计划时间但已完成的任务会被漏掉的问题,统计更完整。
|
||||
- 修复关闭应用时加载状态未及时更新的问题,应用退出过程更自然。
|
||||
- 调整弹窗的最小高度设置,显示更加美观。
|
||||
- 提升内嵌页面的安全设置,使用更放心。
|
||||
|
||||
## [1.4.67]
|
||||
|
||||
### Features
|
||||
|
||||
- 支持为每个人设置「未完成任务上限」,避免一次接太多任务,方便控制工作节奏。
|
||||
- 任务列表支持“一键归档已完成任务”,让列表更清爽。
|
||||
- 支持自定义微应用菜单,可按实际需要配置和保存菜单项,入口更符合团队习惯。
|
||||
- 调整窗口和各组件的高度表现,在不同窗口大小下内容显示更合理。
|
||||
- 更新默认智能助手模型为更高效版本,回答速度和质量更均衡。
|
||||
- 优化文件管理页面展示效果:列表更清晰,文件内容与侧边抽屉的外观更统一。
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- 修复桌面端部分设备在打开新窗口时可能出现的报错问题,使用更稳定。
|
||||
- 修复部分组件在全屏或窗口变化时高度计算不准确的问题,避免内容被遮挡或留白过多。
|
||||
- 修正微模态弹窗的定位问题,在全屏场景下显示更正常。
|
||||
|
||||
## [1.4.43]
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@ -1359,11 +1359,30 @@ class ProjectController extends AbstractController
|
||||
'style' => 'font-weight: bold;padding-bottom: 4px;',
|
||||
];
|
||||
//
|
||||
$startTime = Carbon::parse($time[0])->startOfDay();
|
||||
$endTime = Carbon::parse($time[1])->endOfDay();
|
||||
$builder = ProjectTask::with(['taskTag'])->select(['project_tasks.*', 'project_task_users.userid as ownerid'])
|
||||
->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id')
|
||||
->where('project_task_users.owner', 1)
|
||||
->whereIn('project_task_users.userid', $userid)
|
||||
->betweenTime(Carbon::parse($time[0])->startOfDay(), Carbon::parse($time[1])->endOfDay(), $type);
|
||||
->whereIn('project_task_users.userid', $userid);
|
||||
// 按导出时间类型筛选:
|
||||
// - createdTime:仅按创建时间范围筛选;
|
||||
// - 任务时间(默认):优先使用任务计划时间筛选,但对“无计划时间”的任务,
|
||||
// 若在考核期内已完成,则按完成时间 complete_at 兜底纳入导出,避免漏掉考核期内完成的任务。
|
||||
if ($type === 'createdTime') {
|
||||
$builder->betweenTime($startTime, $endTime, $type);
|
||||
} else {
|
||||
$builder->where(function ($query) use ($startTime, $endTime) {
|
||||
$query->betweenTime($startTime, $endTime, 'taskTime')
|
||||
->orWhere(function ($q2) use ($startTime, $endTime) {
|
||||
$q2->where(function ($q3) {
|
||||
$q3->whereNull('project_tasks.start_at')
|
||||
->orWhereNull('project_tasks.end_at');
|
||||
})->whereNotNull('project_tasks.complete_at')
|
||||
->whereBetween('project_tasks.complete_at', [$startTime, $endTime]);
|
||||
});
|
||||
});
|
||||
}
|
||||
$builder->orderByDesc('project_tasks.id')->chunk(100, function ($tasks) use ($doo, &$datas) {
|
||||
/** @var ProjectTask $task */
|
||||
foreach ($tasks as $task) {
|
||||
@ -1409,15 +1428,17 @@ class ProjectController extends AbstractController
|
||||
}
|
||||
$actualTime = $task->complete_at ? $totalTime : 0; // 实际完成用时
|
||||
$statusText = '未完成';
|
||||
// 状态判定规则:
|
||||
// - flow_item_name 以 end| 开头:视为结束态,区分“已取消”和“已完成”
|
||||
// - 非 end|,但 complete_at 有值:视为已完成(兼容无流程或历史数据)
|
||||
if (str_starts_with($task->flow_item_name, 'end')) {
|
||||
if (preg_match('/已取消|Cancelled|취소됨|キャンセル済み|Abgebrochen|Annulé|Dibatalkan|Отменено/', $task->flow_item_name)) {
|
||||
$statusText = '已完成';
|
||||
if (ProjectTask::isCanceledFlowName($task->flow_item_name)) {
|
||||
$statusText = '已取消';
|
||||
$actualTime = 0;
|
||||
$testTime = 0;
|
||||
$developTime = 0;
|
||||
$overTime = '-';
|
||||
} elseif (str_contains($task->flow_item_name, '已完成')) {
|
||||
$statusText = '已完成';
|
||||
}
|
||||
} elseif ($task->complete_at) {
|
||||
$statusText = '已完成';
|
||||
@ -1426,15 +1447,15 @@ class ProjectController extends AbstractController
|
||||
$datas[$task->ownerid] = [
|
||||
'index' => 1,
|
||||
'nickname' => Base::filterEmoji(User::userid2nickname($task->ownerid)),
|
||||
'styles' => ["A1:P1" => ["font" => ["bold" => true]]],
|
||||
'styles' => ["A1:Q1" => ["font" => ["bold" => true]]],
|
||||
'data' => [],
|
||||
];
|
||||
}
|
||||
$datas[$task->ownerid]['index']++;
|
||||
if ($statusText === '未完成') {
|
||||
$datas[$task->ownerid]['styles']["P{$datas[$task->ownerid]['index']}"] = ["font" => ["color" => ["rgb" => "ff0000"]]]; // 未完成
|
||||
$datas[$task->ownerid]['styles']["Q{$datas[$task->ownerid]['index']}"] = ["font" => ["color" => ["rgb" => "ff0000"]]]; // 未完成
|
||||
} elseif ($statusText === '已完成' && $task->end_at && Carbon::parse($task->complete_at)->gt($task->end_at)) {
|
||||
$datas[$task->ownerid]['styles']["P{$datas[$task->ownerid]['index']}"] = ["font" => ["color" => ["rgb" => "436FF6"]]]; // 已完成超期
|
||||
$datas[$task->ownerid]['styles']["Q{$datas[$task->ownerid]['index']}"] = ["font" => ["color" => ["rgb" => "436FF6"]]]; // 已完成超期
|
||||
}
|
||||
$datas[$task->ownerid]['data'][] = [
|
||||
$task->id,
|
||||
@ -1476,7 +1497,7 @@ class ProjectController extends AbstractController
|
||||
foreach ($userid as $ownerid) {
|
||||
$data = $datas[$ownerid] ?? [
|
||||
'nickname' => Base::filterEmoji(User::userid2nickname($ownerid)),
|
||||
'styles' => ["A1:P1" => ["font" => ["bold" => true]]],
|
||||
'styles' => ["A1:Q1" => ["font" => ["bold" => true]]],
|
||||
'data' => [],
|
||||
];
|
||||
$title = (count($sheets) + 1) . "." . ($data['nickname'] ?: $ownerid);
|
||||
|
||||
@ -327,6 +327,13 @@ class ReportController extends AbstractController
|
||||
$start_time->startOfWeek();
|
||||
$end_time = Carbon::instance($start_time)->endOfWeek();
|
||||
}
|
||||
// 周报时预计算下一周期时间范围(下周)
|
||||
$next_start_time = null;
|
||||
$next_end_time = null;
|
||||
if ($type === Report::WEEKLY) {
|
||||
$next_start_time = Carbon::instance($start_time)->copy()->addWeek();
|
||||
$next_end_time = Carbon::instance($end_time)->copy()->addWeek();
|
||||
}
|
||||
|
||||
// 生成唯一标识
|
||||
$sign = Report::generateSign($type, 0, Carbon::instance($start_time));
|
||||
@ -362,6 +369,10 @@ class ReportController extends AbstractController
|
||||
->get();
|
||||
if ($complete_task->isNotEmpty()) {
|
||||
foreach ($complete_task as $task) {
|
||||
// 排除取消态任务:不将已取消任务计入“已完成工作”
|
||||
if (ProjectTask::isCanceledFlowName($task->flow_item_name)) {
|
||||
continue;
|
||||
}
|
||||
$complete_at = Carbon::parse($task->complete_at);
|
||||
$remark = $type == Report::WEEKLY ? ('<div style="text-align:center">[' . Doo::translate('周' . ['日', '一', '二', '三', '四', '五', '六'][$complete_at->dayOfWeek]) . ']</div>') : ' ';
|
||||
$completeDatas[] = [
|
||||
@ -377,18 +388,7 @@ class ReportController extends AbstractController
|
||||
|
||||
// 未完成的任务
|
||||
$unfinishedDatas = [];
|
||||
$unfinished_task = ProjectTask::query()
|
||||
->join("projects", "projects.id", "=", "project_tasks.project_id")
|
||||
->whereNull("projects.archived_at")
|
||||
->whereNull("project_tasks.complete_at")
|
||||
->whereNotNull("project_tasks.start_at")
|
||||
->where("project_tasks.end_at", "<", $end_time->toDateTimeString())
|
||||
->whereHas("taskUser", function ($query) use ($user) {
|
||||
$query->where("userid", $user->userid);
|
||||
})
|
||||
->select("project_tasks.*")
|
||||
->orderByDesc("project_tasks.id")
|
||||
->get();
|
||||
$unfinished_task = ProjectTask::buildUnfinishedTaskQuery($user->userid, $start_time, $end_time, true)->get();
|
||||
if ($unfinished_task->isNotEmpty()) {
|
||||
foreach ($unfinished_task as $task) {
|
||||
empty($task->end_at) || $end_at = Carbon::parse($task->end_at);
|
||||
@ -408,8 +408,10 @@ class ReportController extends AbstractController
|
||||
if ($type === Report::WEEKLY) {
|
||||
$title = $user->nickname . "的周报[" . $start_time->format("m/d") . "-" . $end_time->format("m/d") . "]";
|
||||
$title .= "[" . $start_time->month . "月第" . $start_time->weekOfMonth . "周]";
|
||||
$unfinishedTitle = '本周未完成的工作';
|
||||
} else {
|
||||
$title = $user->nickname . "的日报[" . $start_time->format("Y/m/d") . "]";
|
||||
$unfinishedTitle = '今日未完成的工作';
|
||||
}
|
||||
$title = Doo::translate($title);
|
||||
|
||||
@ -422,22 +424,44 @@ class ReportController extends AbstractController
|
||||
])->render();
|
||||
|
||||
$contents[] = '<p> </p>';
|
||||
$contents[] = '<h2>' . Doo::translate('未完成的工作') . '</h2>';
|
||||
$contents[] = '<h2>' . Doo::translate($unfinishedTitle) . '</h2>';
|
||||
$contents[] = view('report', [
|
||||
'labels' => $labels,
|
||||
'datas' => $unfinishedDatas,
|
||||
])->render();
|
||||
|
||||
if ($type === Report::WEEKLY) {
|
||||
// 下周拟定计划:基于下周时间范围预生成候选任务
|
||||
$nextPlanDatas = [];
|
||||
if ($next_start_time && $next_end_time) {
|
||||
$next_tasks = ProjectTask::buildUnfinishedTaskQuery($user->userid, $next_start_time, $next_end_time, false)->get();
|
||||
if ($next_tasks->isNotEmpty()) {
|
||||
foreach ($next_tasks as $task) {
|
||||
$planTime = '-';
|
||||
if ($task->start_at || $task->end_at) {
|
||||
$startText = $task->start_at ? Carbon::parse($task->start_at)->format('Y-m-d H:i') : '';
|
||||
$endText = $task->end_at ? Carbon::parse($task->end_at)->format('Y-m-d H:i') : '';
|
||||
$planTime = trim($startText . ($endText ? (' ~ ' . $endText) : ''));
|
||||
}
|
||||
$nextPlanDatas[] = [
|
||||
'[' . $task->project->name . '] ' . $task->name,
|
||||
$planTime,
|
||||
$task->taskUser->where("owner", 1)->map(function ($item) {
|
||||
return User::userid2nickname($item->userid);
|
||||
})->implode(", "),
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
$contents[] = '<p> </p>';
|
||||
$contents[] = "<h2>" . Doo::translate("下周拟定计划") . "[" . $start_time->addWeek()->format("m/d") . "-" . $end_time->addWeek()->format("m/d") . "]</h2>";
|
||||
$contents[] = "<h2>" . Doo::translate("下周拟定计划") . "[" . $next_start_time->format("m/d") . "-" . $next_end_time->format("m/d") . "]</h2>";
|
||||
$contents[] = view('report', [
|
||||
'labels' => [
|
||||
Doo::translate('计划描述'),
|
||||
Doo::translate('计划时间'),
|
||||
Doo::translate('负责人'),
|
||||
],
|
||||
'datas' => [],
|
||||
'datas' => $nextPlanDatas,
|
||||
])->render();
|
||||
}
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@ class SystemController extends AbstractController
|
||||
* @apiParam {String} type
|
||||
* - get: 获取(默认)
|
||||
* - 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', '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', 'system_welcome', 'image_compress', 'image_quality', 'image_save_local'])
|
||||
|
||||
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||
@ -80,6 +80,7 @@ class SystemController extends AbstractController
|
||||
'archived_day',
|
||||
'task_visible',
|
||||
'task_default_time',
|
||||
'task_user_limit',
|
||||
'all_group_mute',
|
||||
'all_group_autoin',
|
||||
'user_private_chat_mute',
|
||||
@ -722,6 +723,47 @@ class SystemController extends AbstractController
|
||||
return Base::retSuccess($type == 'save' ? '保存成功' : 'success', $setting);
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {post} api/system/microapp_menu 自定义应用菜单
|
||||
*
|
||||
* @apiDescription 获取或保存自定义微应用菜单,仅管理员可配置
|
||||
* @apiVersion 1.0.0
|
||||
* @apiGroup system
|
||||
* @apiName microapp_menu
|
||||
*
|
||||
* @apiParam {String} type
|
||||
* - get: 获取(默认)
|
||||
* - save: 保存(限管理员)
|
||||
* @apiParam {Array} list 菜单列表,格式:[{id,name,version,menu_items}]
|
||||
*
|
||||
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||
* @apiSuccess {Object} data 返回数据
|
||||
*/
|
||||
public function microapp_menu()
|
||||
{
|
||||
$type = trim(Request::input('type'));
|
||||
$user = User::auth();
|
||||
if ($type == 'save') {
|
||||
User::auth('admin');
|
||||
$list = Request::input('list');
|
||||
if (empty($list) || !is_array($list)) {
|
||||
$list = [];
|
||||
}
|
||||
$apps = Setting::normalizeCustomMicroApps($list);
|
||||
$setting = Base::setting('microapp_menu', $apps);
|
||||
$setting = Setting::formatCustomMicroAppsForResponse($setting);
|
||||
} else {
|
||||
$setting = Base::setting('microapp_menu');
|
||||
if (!is_array($setting)) {
|
||||
$setting = [];
|
||||
}
|
||||
$setting = Setting::filterCustomMicroAppsForUser($setting, $user);
|
||||
$setting = Setting::formatCustomMicroAppsForResponse($setting);
|
||||
}
|
||||
return Base::retSuccess($type == 'save' ? '保存成功' : 'success', $setting);
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {post} api/system/column/template 创建项目模板
|
||||
*
|
||||
|
||||
@ -37,6 +37,7 @@ use App\Models\UserRecentItem;
|
||||
use App\Models\UserTag;
|
||||
use App\Models\UserTagRecognition;
|
||||
use App\Models\UserAppSort;
|
||||
use App\Module\Apps;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\UserEmailVerification;
|
||||
use App\Module\AgoraIO\AgoraTokenGenerator;
|
||||
@ -1098,6 +1099,8 @@ class UsersController extends AbstractController
|
||||
$upArray = [];
|
||||
$upLdap = [];
|
||||
$transferUser = null;
|
||||
$hookAction = '';
|
||||
$hookEvent = '';
|
||||
switch ($type) {
|
||||
case 'setadmin':
|
||||
$msg = '设置成功';
|
||||
@ -1179,12 +1182,16 @@ class UsersController extends AbstractController
|
||||
return Base::retError('交接人已离职,请选择另一个交接人');
|
||||
}
|
||||
}
|
||||
$hookAction = 'user_offboard';
|
||||
$hookEvent = 'offboard';
|
||||
break;
|
||||
|
||||
case 'cleardisable':
|
||||
$msg = '操作成功';
|
||||
$upArray['identity'] = array_diff($userInfo->identity, ['disable']);
|
||||
$upArray['disable_at'] = null;
|
||||
$hookAction = 'user_onboard';
|
||||
$hookEvent = 'restore';
|
||||
break;
|
||||
|
||||
case 'delete':
|
||||
@ -1303,6 +1310,9 @@ class UsersController extends AbstractController
|
||||
}
|
||||
});
|
||||
}
|
||||
if ($hookAction) {
|
||||
Apps::dispatchUserHook($userInfo, $hookAction, $hookEvent);
|
||||
}
|
||||
//
|
||||
return Base::retSuccess($msg, $userInfo);
|
||||
}
|
||||
|
||||
@ -4,8 +4,10 @@ namespace App\Http\Middleware;
|
||||
|
||||
@error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
|
||||
|
||||
use App\Module\Base;
|
||||
use App\Module\Doo;
|
||||
use App\Services\RequestContext;
|
||||
use Cache;
|
||||
use Closure;
|
||||
|
||||
class WebApi
|
||||
@ -29,6 +31,12 @@ class WebApi
|
||||
// 加载Doo类
|
||||
Doo::load();
|
||||
|
||||
// 记录 PC 端活跃时间
|
||||
$userid = Doo::userId();
|
||||
if ($userid > 0 && Base::isPc()) {
|
||||
Cache::put("user_pc_active:{$userid}", time(), 60);
|
||||
}
|
||||
|
||||
// 解密请求内容
|
||||
$encrypt = Doo::pgpParseStr($request->header('encrypt'));
|
||||
if ($request->isMethod('post')) {
|
||||
|
||||
@ -396,6 +396,7 @@ class ProjectTask extends AbstractModel
|
||||
$userid = User::userid();
|
||||
$visibility = $data['visibility_appoint'] ?? $data['visibility'];
|
||||
$visibility_userids = $data['visibility_appointor'] ?: [];
|
||||
$taskUserLimit = intval(Base::settingFind('system', 'task_user_limit'));
|
||||
//
|
||||
if (ProjectTask::whereProjectId($project_id)
|
||||
->whereNull('project_tasks.complete_at')
|
||||
@ -455,8 +456,8 @@ class ProjectTask extends AbstractModel
|
||||
if (ProjectTask::authData($uid)
|
||||
->whereNull('project_tasks.complete_at')
|
||||
->whereNull('project_tasks.archived_at')
|
||||
->count() > 500) {
|
||||
throw new ApiException(User::userid2nickname($uid) . '负责或参与的未完成任务最多不能超过500个');
|
||||
->count() > $taskUserLimit) {
|
||||
throw new ApiException(User::userid2nickname($uid) . '负责或参与的未完成任务最多不能超过' . $taskUserLimit . '个');
|
||||
}
|
||||
$tmpArray[] = $uid;
|
||||
}
|
||||
@ -2009,4 +2010,64 @@ class ProjectTask extends AbstractModel
|
||||
//
|
||||
return $task;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建指定周期内的未完成任务查询(用于周报/日报等)
|
||||
* @param int $userid
|
||||
* @param Carbon $start_time
|
||||
* @param Carbon $end_time
|
||||
* @param bool $includeUpdatedForNoPlan 无计划时间任务是否按周期内更新时间一并纳入
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public static function buildUnfinishedTaskQuery(int $userid, Carbon $start_time, Carbon $end_time, bool $includeUpdatedForNoPlan = true)
|
||||
{
|
||||
return self::query()
|
||||
->join("projects", "projects.id", "=", "project_tasks.project_id")
|
||||
->whereNull("projects.archived_at")
|
||||
->whereNull("project_tasks.complete_at")
|
||||
->whereHas("taskUser", function ($query) use ($userid) {
|
||||
$query->where("userid", $userid);
|
||||
})
|
||||
->where(function ($query) use ($start_time, $end_time, $includeUpdatedForNoPlan) {
|
||||
// 1) 有计划时间:计划时间与给定周期 [start_time, end_time] 有交集
|
||||
$query->where(function ($q1) use ($start_time, $end_time) {
|
||||
$q1->whereNotNull('project_tasks.start_at')
|
||||
->whereNotNull('project_tasks.end_at')
|
||||
->where(function ($q2) use ($start_time, $end_time) {
|
||||
$q2->whereBetween('project_tasks.start_at', [$start_time->toDateTimeString(), $end_time->toDateTimeString()])
|
||||
->orWhereBetween('project_tasks.end_at', [$start_time->toDateTimeString(), $end_time->toDateTimeString()])
|
||||
->orWhere(function ($q3) use ($start_time, $end_time) {
|
||||
$q3->where('project_tasks.start_at', '<=', $start_time->toDateTimeString())
|
||||
->where('project_tasks.end_at', '>=', $end_time->toDateTimeString());
|
||||
});
|
||||
});
|
||||
});
|
||||
// 2) 无计划时间
|
||||
$query->orWhere(function ($q1) use ($start_time, $end_time, $includeUpdatedForNoPlan) {
|
||||
$q1->whereNull('project_tasks.start_at')
|
||||
->whereNull('project_tasks.end_at')
|
||||
->where(function ($q2) use ($start_time, $end_time, $includeUpdatedForNoPlan) {
|
||||
$q2->whereBetween('project_tasks.created_at', [$start_time->toDateTimeString(), $end_time->toDateTimeString()]);
|
||||
if ($includeUpdatedForNoPlan) {
|
||||
$q2->orWhereBetween('project_tasks.updated_at', [$start_time->toDateTimeString(), $end_time->toDateTimeString()]);
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
->select("project_tasks.*")
|
||||
->orderByDesc("project_tasks.id");
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断工作流名称是否为取消态(多语言)
|
||||
* @param string|null $flowItemName
|
||||
* @return bool
|
||||
*/
|
||||
public static function isCanceledFlowName(?string $flowItemName): bool
|
||||
{
|
||||
if (empty($flowItemName)) {
|
||||
return false;
|
||||
}
|
||||
return preg_match('/已取消|Cancelled|취소됨|キャンセル済み|Abgebrochen|Annulé|Dibatalkan|Отменено/', $flowItemName) === 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -55,6 +55,7 @@ class Setting extends AbstractModel
|
||||
$value['image_compress'] = $value['image_compress'] ?: 'open';
|
||||
$value['image_quality'] = min(100, max(0, intval($value['image_quality']) ?: 90));
|
||||
$value['image_save_local'] = $value['image_save_local'] ?: 'open';
|
||||
$value['task_user_limit'] = min(2000, max(1, intval($value['task_user_limit']) ?: 500));
|
||||
if (!is_array($value['task_default_time']) || count($value['task_default_time']) != 2 || !Timer::isTime($value['task_default_time'][0]) || !Timer::isTime($value['task_default_time'][1])) {
|
||||
$value['task_default_time'] = ['09:00', '18:00'];
|
||||
}
|
||||
@ -164,6 +165,213 @@ class Setting extends AbstractModel
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* 规范自定义微应用配置
|
||||
* @param array $list
|
||||
* @return array
|
||||
*/
|
||||
public static function normalizeCustomMicroApps($list)
|
||||
{
|
||||
if (!is_array($list)) {
|
||||
return [];
|
||||
}
|
||||
$apps = [];
|
||||
foreach ($list as $item) {
|
||||
$app = self::normalizeCustomMicroAppItem($item);
|
||||
if ($app) {
|
||||
$apps[] = $app;
|
||||
}
|
||||
}
|
||||
return $apps;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户身份过滤可见的自定义微应用
|
||||
* @param array $apps
|
||||
* @param \App\Models\User|null $user
|
||||
* @return array
|
||||
*/
|
||||
public static function filterCustomMicroAppsForUser(array $apps, $user)
|
||||
{
|
||||
if (empty($apps)) {
|
||||
return [];
|
||||
}
|
||||
$isAdmin = $user ? $user->isAdmin() : false;
|
||||
$userId = $user ? intval($user->userid) : 0;
|
||||
$filtered = [];
|
||||
foreach ($apps as $app) {
|
||||
$visible = self::normalizeCustomMicroVisible($app['visible_to'] ?? ['admin']);
|
||||
if (!self::isCustomMicroVisibleTo($visible, $isAdmin, $userId)) {
|
||||
continue;
|
||||
}
|
||||
if (empty($app['menu_items']) || !is_array($app['menu_items'])) {
|
||||
continue;
|
||||
}
|
||||
$menus = array_values(array_filter($app['menu_items'], function ($menu) use ($isAdmin, $userId) {
|
||||
if (!isset($menu['visible_to'])) {
|
||||
return true;
|
||||
}
|
||||
$visible = self::normalizeCustomMicroVisible($menu['visible_to']);
|
||||
return self::isCustomMicroVisibleTo($visible, $isAdmin, $userId);
|
||||
}));
|
||||
if (empty($menus)) {
|
||||
continue;
|
||||
}
|
||||
$app['menu_items'] = $menus;
|
||||
$filtered[] = $app;
|
||||
}
|
||||
return $filtered;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将存储结构转换成 appstore 接口同款格式
|
||||
* @param array $apps
|
||||
* @return array
|
||||
*/
|
||||
public static function formatCustomMicroAppsForResponse(array $apps)
|
||||
{
|
||||
return array_values(array_map(function ($app) {
|
||||
unset($app['visible_to']);
|
||||
if (!empty($app['menu_items']) && is_array($app['menu_items'])) {
|
||||
$app['menu_items'] = array_values(array_map(function ($menu) {
|
||||
$menu['keep_alive'] = isset($menu['keep_alive']) ? (bool)$menu['keep_alive'] : true;
|
||||
$menu['disable_scope_css'] = (bool)($menu['disable_scope_css'] ?? false);
|
||||
$menu['auto_dark_theme'] = isset($menu['auto_dark_theme']) ? (bool)$menu['auto_dark_theme'] : true;
|
||||
$menu['transparent'] = (bool)($menu['transparent'] ?? false);
|
||||
if (isset($menu['visible_to'])) {
|
||||
unset($menu['visible_to']);
|
||||
}
|
||||
return $menu;
|
||||
}, $app['menu_items']));
|
||||
}
|
||||
return $app;
|
||||
}, $apps));
|
||||
}
|
||||
|
||||
/**
|
||||
* 规范自定义微应用
|
||||
* @param array $item
|
||||
* @return array|null
|
||||
*/
|
||||
protected static function normalizeCustomMicroAppItem($item)
|
||||
{
|
||||
if (!is_array($item)) {
|
||||
return null;
|
||||
}
|
||||
$id = trim($item['id'] ?? '');
|
||||
if ($id === '') {
|
||||
return null;
|
||||
}
|
||||
$name = Base::newTrim($item['name'] ?? '');
|
||||
$version = Base::newTrim($item['version'] ?? '') ?: 'custom';
|
||||
$menuItems = [];
|
||||
if (isset($item['menu_items']) && is_array($item['menu_items'])) {
|
||||
$menuItems = $item['menu_items'];
|
||||
} elseif (isset($item['menu']) && is_array($item['menu'])) {
|
||||
$menuItems = [$item['menu']];
|
||||
}
|
||||
if (empty($menuItems)) {
|
||||
return null;
|
||||
}
|
||||
$normalizedMenus = [];
|
||||
foreach ($menuItems as $menu) {
|
||||
$formattedMenu = self::normalizeCustomMicroMenuItem($menu, $name ?: $id);
|
||||
if ($formattedMenu) {
|
||||
$normalizedMenus[] = $formattedMenu;
|
||||
}
|
||||
}
|
||||
if (empty($normalizedMenus)) {
|
||||
return null;
|
||||
}
|
||||
return Base::newTrim([
|
||||
'id' => $id,
|
||||
'name' => $name,
|
||||
'version' => $version,
|
||||
'menu_items' => $normalizedMenus,
|
||||
'visible_to' => self::normalizeCustomMicroVisible($item['visible_to'] ?? 'admin'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 规范自定义微应用菜单项
|
||||
* @param array $menu
|
||||
* @param string $fallbackLabel
|
||||
* @return array|null
|
||||
*/
|
||||
protected static function normalizeCustomMicroMenuItem($menu, $fallbackLabel = '')
|
||||
{
|
||||
if (!is_array($menu)) {
|
||||
return null;
|
||||
}
|
||||
$url = trim($menu['url'] ?? '');
|
||||
if ($url === '') {
|
||||
return null;
|
||||
}
|
||||
$location = trim($menu['location'] ?? 'application');
|
||||
$label = trim($menu['label'] ?? $fallbackLabel);
|
||||
$urlType = strtolower(trim($menu['url_type'] ?? 'iframe'));
|
||||
$payload = [
|
||||
'location' => $location,
|
||||
'label' => $label,
|
||||
'icon' => Base::newTrim($menu['icon'] ?? ''),
|
||||
'url' => $url,
|
||||
'url_type' => $urlType,
|
||||
'keep_alive' => isset($menu['keep_alive']) ? (bool)$menu['keep_alive'] : true,
|
||||
'disable_scope_css' => (bool)($menu['disable_scope_css'] ?? false),
|
||||
'auto_dark_theme' => isset($menu['auto_dark_theme']) ? (bool)$menu['auto_dark_theme'] : true,
|
||||
'transparent' => (bool)($menu['transparent'] ?? false),
|
||||
];
|
||||
if (!empty($menu['background'])) {
|
||||
$payload['background'] = Base::newTrim($menu['background']);
|
||||
}
|
||||
if (!empty($menu['capsule']) && is_array($menu['capsule'])) {
|
||||
$payload['capsule'] = Base::newTrim($menu['capsule']);
|
||||
}
|
||||
return $payload;
|
||||
}
|
||||
|
||||
/**
|
||||
* 规范自定义微应用可见范围
|
||||
* @param mixed $value
|
||||
* @return array
|
||||
*/
|
||||
protected static function normalizeCustomMicroVisible($value)
|
||||
{
|
||||
if (is_array($value)) {
|
||||
$list = array_filter(array_map('trim', $value));
|
||||
} else {
|
||||
$list = array_filter(array_map('trim', explode(',', (string)$value)));
|
||||
}
|
||||
if (empty($list)) {
|
||||
return ['admin'];
|
||||
}
|
||||
if (in_array('all', $list)) {
|
||||
return ['all'];
|
||||
}
|
||||
return array_values($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断自定义微应用是否可见
|
||||
* @param array $visible
|
||||
* @param bool $isAdmin
|
||||
* @param int $userId
|
||||
* @return bool
|
||||
*/
|
||||
protected static function isCustomMicroVisibleTo(array $visible, bool $isAdmin, int $userId)
|
||||
{
|
||||
if (in_array('all', $visible)) {
|
||||
return true;
|
||||
}
|
||||
if ($isAdmin && in_array('admin', $visible)) {
|
||||
return true;
|
||||
}
|
||||
if ($userId > 0 && in_array((string)$userId, $visible, true)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证邮箱地址(过滤忽略地址)
|
||||
* @param $array
|
||||
|
||||
@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Exceptions\ApiException;
|
||||
use App\Module\Base;
|
||||
use App\Module\Doo;
|
||||
use App\Module\Apps;
|
||||
use App\Module\Table\OnlineData;
|
||||
use App\Services\RequestContext;
|
||||
use Cache;
|
||||
@ -313,7 +314,7 @@ class User extends AbstractModel
|
||||
*/
|
||||
public function deleteUser($reason)
|
||||
{
|
||||
return AbstractModel::transaction(function () use ($reason) {
|
||||
$ret = AbstractModel::transaction(function () use ($reason) {
|
||||
// 删除原因
|
||||
$userDelete = UserDelete::createInstance([
|
||||
'operator' => User::userid(),
|
||||
@ -334,6 +335,10 @@ class User extends AbstractModel
|
||||
//
|
||||
return $this->delete();
|
||||
});
|
||||
if ($ret) {
|
||||
Apps::dispatchUserHook($this, 'user_offboard', 'delete');
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -407,7 +412,9 @@ class User extends AbstractModel
|
||||
$dialog?->joinGroup($user->userid, 0);
|
||||
}
|
||||
}
|
||||
return $user->find($user->userid);
|
||||
$createdUser = $user->find($user->userid);
|
||||
Apps::dispatchUserHook($createdUser, 'user_onboard', 'onboard');
|
||||
return $createdUser;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -10,6 +10,7 @@ namespace App\Models;
|
||||
* @property string $key
|
||||
* @property string|null $fd
|
||||
* @property string|null $path
|
||||
* @property string|null $platform 平台类型:android, ios, win, mac, web
|
||||
* @property int|null $userid
|
||||
* @property \Illuminate\Support\Carbon|null $created_at
|
||||
* @property \Illuminate\Support\Carbon|null $updated_at
|
||||
@ -27,6 +28,7 @@ namespace App\Models;
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|WebSocket whereId($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|WebSocket whereKey($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|WebSocket wherePath($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|WebSocket wherePlatform($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|WebSocket whereUpdatedAt($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|WebSocket whereUserid($value)
|
||||
* @mixin \Eloquent
|
||||
|
||||
@ -22,7 +22,7 @@ class AI
|
||||
'qianwen',
|
||||
'wenxin'
|
||||
];
|
||||
protected const OPENAI_DEFAULT_MODEL = 'gpt-5-mini';
|
||||
protected const OPENAI_DEFAULT_MODEL = 'gpt-5.1-mini';
|
||||
|
||||
protected $post = [];
|
||||
protected $headers = [];
|
||||
@ -730,6 +730,12 @@ class AI
|
||||
return false;
|
||||
}
|
||||
$model = $provider['model'] ?? '';
|
||||
return str_starts_with($model, 'gpt-5');
|
||||
|
||||
// 匹配 gpt- 开头后跟数字的模型名称
|
||||
if (preg_match('/^gpt-(\d+)/', $model, $matches)) {
|
||||
return intval($matches[1]) >= 5;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,8 +3,11 @@
|
||||
namespace App\Module;
|
||||
|
||||
use App\Exceptions\ApiException;
|
||||
use App\Models\User;
|
||||
use App\Services\RequestContext;
|
||||
use Symfony\Component\Yaml\Yaml;
|
||||
use App\Module\Base;
|
||||
use App\Module\Ihttp;
|
||||
|
||||
class Apps
|
||||
{
|
||||
@ -57,4 +60,43 @@ class Apps
|
||||
throw new ApiException("应用「{$name}」未安装", [], 0, false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch user lifecycle hook to appstore (onboard/offboard/delete/restore).
|
||||
*/
|
||||
public static function dispatchUserHook(User $user, string $action, string $eventType = ''): void
|
||||
{
|
||||
$appKey = env('APP_KEY', '');
|
||||
if (empty($appKey)) {
|
||||
info('[appstore_hook] APP_KEY is empty, skip dispatchUserHook');
|
||||
return;
|
||||
}
|
||||
|
||||
$url = sprintf('http://appstore/api/v1/internal/hooks/%s', $action);
|
||||
$payload = [
|
||||
'user' => [
|
||||
'id' => (string) $user->userid,
|
||||
'email' => (string) $user->email,
|
||||
'name' => (string) $user->nickname,
|
||||
'role' => in_array('admin', $user->identity ?? []) ? 'admin' : 'normal',
|
||||
],
|
||||
];
|
||||
if ($eventType !== '') {
|
||||
$payload['event_type'] = $eventType;
|
||||
}
|
||||
|
||||
$headers = [
|
||||
'Content-Type' => 'application/json',
|
||||
'Authorization' => 'Bearer ' . md5($appKey),
|
||||
];
|
||||
|
||||
$resp = Ihttp::ihttp_request($url, json_encode($payload, JSON_UNESCAPED_UNICODE), $headers, 5);
|
||||
if (Base::isError($resp)) {
|
||||
info('[appstore_hook] dispatch fail', [
|
||||
'url' => $url,
|
||||
'payload' => $payload,
|
||||
'error' => $resp,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1301,7 +1301,7 @@ class Base
|
||||
/**
|
||||
* 获取或设置
|
||||
* @param $setname // 配置名称
|
||||
* @param bool $array // 保存内容
|
||||
* @param bool|array $array // 保存内容
|
||||
* @param bool $isUpdate // 保存内容为更新模式,默认否
|
||||
* @return array
|
||||
*/
|
||||
@ -1827,6 +1827,19 @@ class Base
|
||||
return $platform;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是PC端(包括 Electron 桌面端和 Web 浏览器)
|
||||
* @param string|null $platform 平台类型,不传则自动获取
|
||||
* @return bool
|
||||
*/
|
||||
public static function isPc($platform = null)
|
||||
{
|
||||
if ($platform === null) {
|
||||
$platform = self::platform();
|
||||
}
|
||||
return in_array($platform, ['win', 'mac', 'web']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是App移动端
|
||||
* @return bool
|
||||
|
||||
@ -64,7 +64,7 @@ class WebSocketService implements WebSocketHandlerInterface
|
||||
'ud' => $userid,
|
||||
],
|
||||
]));
|
||||
$this->userOn($fd, $userid);
|
||||
$this->userOn($fd, $userid, $get['platform']);
|
||||
} else {
|
||||
// 用户不存在
|
||||
$server->push($fd, Base::array2json([
|
||||
@ -105,6 +105,11 @@ class WebSocketService implements WebSocketHandlerInterface
|
||||
|
||||
// 握手信息
|
||||
case 'handshake':
|
||||
// 更新 PC 端活跃时间
|
||||
$row = WebSocket::whereFd($frame->fd)->first();
|
||||
if ($row && Base::isPc($row->platform)) {
|
||||
Cache::put("user_pc_active:{$row->userid}", time(), 60);
|
||||
}
|
||||
break;
|
||||
|
||||
// 访问状态
|
||||
@ -166,17 +171,27 @@ class WebSocketService implements WebSocketHandlerInterface
|
||||
* 用户上线
|
||||
* @param $fd
|
||||
* @param $userid
|
||||
* @param $platform
|
||||
* @return void
|
||||
*/
|
||||
private function userOn($fd, $userid)
|
||||
private function userOn($fd, $userid, $platform = 'web')
|
||||
{
|
||||
// 校验平台类型
|
||||
if (!in_array($platform, ['android', 'ios', 'win', 'mac', 'web'])) {
|
||||
$platform = 'web';
|
||||
}
|
||||
WebSocket::updateInsert([
|
||||
'key' => md5($fd . '@' . $userid)
|
||||
], [
|
||||
'fd' => $fd,
|
||||
'userid' => $userid,
|
||||
'platform' => $platform,
|
||||
]);
|
||||
OnlineData::online($userid);
|
||||
// PC 端上线时更新活跃时间
|
||||
if (Base::isPc($platform)) {
|
||||
Cache::put("user_pc_active:{$userid}", time(), 60);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -2,7 +2,10 @@
|
||||
namespace App\Tasks;
|
||||
|
||||
use App\Models\UmengAlias;
|
||||
use App\Models\WebSocketDialogMsgRead;
|
||||
use App\Module\Base;
|
||||
use Cache;
|
||||
use Hhxsv5\LaravelS\Swoole\Task\Task;
|
||||
|
||||
/**
|
||||
* 推送友盟消息
|
||||
@ -11,6 +14,7 @@ class PushUmengMsg extends AbstractTask
|
||||
{
|
||||
protected $userid = 0;
|
||||
protected $array = [];
|
||||
protected $endPush = []; // 需要在 end() 方法中处理的延迟推送列表
|
||||
|
||||
/**
|
||||
* @param array|int $userid
|
||||
@ -32,11 +36,68 @@ class PushUmengMsg extends AbstractTask
|
||||
if ($setting['push'] !== 'open') {
|
||||
return;
|
||||
}
|
||||
UmengAlias::pushMsgToUserid($this->userid, $this->array);
|
||||
|
||||
// 消息ID
|
||||
$msgId = isset($this->array['id']) ? intval($this->array['id']) : 0;
|
||||
|
||||
// 处理用户列表
|
||||
$userids = is_array($this->userid) ? $this->userid : [$this->userid];
|
||||
$directPushUsers = []; // 直接推送的用户
|
||||
$delayedPushUsers = []; // 需要延迟推送的用户
|
||||
|
||||
foreach ($userids as $uid) {
|
||||
if ($this->getDelay() > 0) {
|
||||
// 已经延迟过,检查消息是否已读
|
||||
if ($msgId > 0) {
|
||||
$isRead = WebSocketDialogMsgRead::whereMsgId($msgId)
|
||||
->whereUserid($uid)
|
||||
->whereNotNull('read_at')
|
||||
->exists();
|
||||
if ($isRead) {
|
||||
// 已读,跳过推送
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// 未读或无法判断,执行推送
|
||||
$directPushUsers[] = $uid;
|
||||
} else {
|
||||
// 首次推送,检查 PC 端是否活跃
|
||||
$lastActive = Cache::get("user_pc_active:{$uid}");
|
||||
$isPcActive = $lastActive && (time() - $lastActive) < 60;
|
||||
|
||||
if ($isPcActive) {
|
||||
// PC 端活跃,需要延迟推送
|
||||
$delayedPushUsers[] = $uid;
|
||||
} else {
|
||||
// PC 端不活跃,直接推送
|
||||
$directPushUsers[] = $uid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 直接推送
|
||||
if ($directPushUsers) {
|
||||
UmengAlias::pushMsgToUserid($directPushUsers, $this->array);
|
||||
}
|
||||
|
||||
// 创建延迟推送任务
|
||||
if ($delayedPushUsers) {
|
||||
$this->endPush[] = [
|
||||
'userid' => $delayedPushUsers,
|
||||
'array' => $this->array,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function end()
|
||||
{
|
||||
|
||||
if (empty($this->endPush)) {
|
||||
return;
|
||||
}
|
||||
foreach ($this->endPush as $item) {
|
||||
$task = new PushUmengMsg($item['userid'], $item['array']);
|
||||
$task->delay(10);
|
||||
Task::deliver($task);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,6 +211,10 @@ class WebSocketDialogMsgTask extends AbstractTask
|
||||
'description' => "MID:{$msg->id}",
|
||||
'seconds' => 3600,
|
||||
'badge' => 1,
|
||||
'extra' => [
|
||||
'dialog_id' => $msg->dialog_id,
|
||||
'msg_id' => $msg->id,
|
||||
]
|
||||
];
|
||||
$this->endArray[] = new PushUmengMsg($uids->toArray(), $umengMsg);
|
||||
}
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddWebSocketsPlatform extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('web_sockets', function (Blueprint $table) {
|
||||
$table->string('platform', 20)->nullable()->default('')->after('path')->comment('平台类型:android, ios, win, mac, web');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('web_sockets', function (Blueprint $table) {
|
||||
$table->dropColumn('platform');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -96,10 +96,10 @@ services:
|
||||
appstore:
|
||||
container_name: "dootask-appstore-${APP_ID}"
|
||||
privileged: true
|
||||
image: "dootask/appstore:0.3.0"
|
||||
image: "dootask/appstore:0.3.4"
|
||||
volumes:
|
||||
- shared_data:/usr/share/dootask
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ${HOST_DOCKER_SOCK:-/var/run/docker.sock}:/var/run/docker.sock
|
||||
- ./:/var/www
|
||||
environment:
|
||||
HOST_PWD: "${PWD}"
|
||||
|
||||
17
electron/electron.js
vendored
17
electron/electron.js
vendored
@ -497,6 +497,14 @@ function createChildWindow(args) {
|
||||
const wind = childWindow.find(item => item.name == name);
|
||||
let browser = wind ? wind.browser : null;
|
||||
let isPreload = false;
|
||||
// 清理已销毁但仍被引用的窗口,避免对失效对象调用方法
|
||||
if (browser && browser.isDestroyed && browser.isDestroyed()) {
|
||||
const index = childWindow.findIndex(item => item.name == name);
|
||||
if (index > -1) {
|
||||
childWindow.splice(index, 1);
|
||||
}
|
||||
browser = null;
|
||||
}
|
||||
if (browser) {
|
||||
browser.focus();
|
||||
if (args.force === false) {
|
||||
@ -521,6 +529,11 @@ function createChildWindow(args) {
|
||||
contextIsolation: true,
|
||||
}, webPreferences),
|
||||
}, config)
|
||||
|
||||
options.width = utils.normalizeSize(options.width, 1280)
|
||||
options.height = utils.normalizeSize(options.height, 800)
|
||||
options.minWidth = utils.normalizeSize(options.minWidth, 360)
|
||||
options.minHeight = utils.normalizeSize(options.minHeight, 360)
|
||||
if (!options.webPreferences.contextIsolation) {
|
||||
delete options.webPreferences.preload;
|
||||
}
|
||||
@ -528,7 +541,7 @@ function createChildWindow(args) {
|
||||
options.parent = mainWindow
|
||||
}
|
||||
|
||||
if (preloadWindow && Object.keys(webPreferences).length === 0) {
|
||||
if (preloadWindow && !preloadWindow.isDestroyed?.() && Object.keys(webPreferences).length === 0) {
|
||||
// 使用预加载窗口
|
||||
browser = preloadWindow;
|
||||
preloadWindow = null;
|
||||
@ -574,7 +587,7 @@ function createChildWindow(args) {
|
||||
})
|
||||
|
||||
browser.on('closed', () => {
|
||||
const index = childWindow.findIndex(item => item.name == name);
|
||||
const index = childWindow.findIndex(item => item.browser === browser);
|
||||
if (index > -1) {
|
||||
childWindow.splice(index, 1)
|
||||
}
|
||||
|
||||
34
electron/lib/mcp.js
vendored
34
electron/lib/mcp.js
vendored
@ -80,12 +80,33 @@
|
||||
* - "把所有未读报告标记为已读"
|
||||
*/
|
||||
|
||||
const { FastMCP } = require('fastmcp');
|
||||
let FastMCP = null;
|
||||
const { z } = require('zod');
|
||||
const loger = require("electron-log");
|
||||
const TurndownService = require('turndown');
|
||||
const { marked } = require('marked');
|
||||
|
||||
async function loadFastMCP() {
|
||||
if (FastMCP) {
|
||||
return FastMCP;
|
||||
}
|
||||
|
||||
// Prefer require for environments that still support CJS entry, fall back to ESM import when exports block it.
|
||||
try {
|
||||
const maybeModule = require('fastmcp');
|
||||
FastMCP = maybeModule.FastMCP || maybeModule.default || maybeModule;
|
||||
return FastMCP;
|
||||
} catch (error) {
|
||||
if (error.code && !['ERR_PACKAGE_PATH_NOT_EXPORTED', 'ERR_REQUIRE_ESM'].includes(error.code)) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
const moduleExports = await import('fastmcp');
|
||||
FastMCP = moduleExports.FastMCP || moduleExports.default || moduleExports;
|
||||
return FastMCP;
|
||||
}
|
||||
|
||||
let mcpServer = null;
|
||||
|
||||
// 初始化 HTML 转 Markdown 工具
|
||||
@ -141,7 +162,14 @@ function markdownToHtml(markdown) {
|
||||
class DooTaskMCP {
|
||||
constructor(mainWindow) {
|
||||
this.mainWindow = mainWindow;
|
||||
this.mcp = new FastMCP({
|
||||
this.mcp = null;
|
||||
this.readyPromise = this.initMCP();
|
||||
}
|
||||
|
||||
async initMCP() {
|
||||
const FastMCPClass = await loadFastMCP();
|
||||
|
||||
this.mcp = new FastMCPClass({
|
||||
name: 'DooTask MCP Server',
|
||||
version: '1.0.0',
|
||||
description: 'DooTask 任务管理 MCP 接口',
|
||||
@ -1862,6 +1890,7 @@ class DooTaskMCP {
|
||||
// 启动 MCP 服务器
|
||||
async start(port = 22224) {
|
||||
try {
|
||||
await this.readyPromise;
|
||||
await this.mcp.start({
|
||||
transportType: 'httpStream',
|
||||
httpStream: {
|
||||
@ -1875,6 +1904,7 @@ class DooTaskMCP {
|
||||
|
||||
// 停止服务器
|
||||
async stop() {
|
||||
await this.readyPromise;
|
||||
if (this.mcp && typeof this.mcp.stop === 'function') {
|
||||
await this.mcp.stop();
|
||||
}
|
||||
|
||||
19
electron/lib/utils.js
vendored
19
electron/lib/utils.js
vendored
@ -108,6 +108,25 @@ const utils = {
|
||||
return _s;
|
||||
},
|
||||
|
||||
/**
|
||||
* 兜底处理尺寸类数值,返回四舍五入后的正整数
|
||||
* @param value
|
||||
* @param fallback
|
||||
* @returns {number}
|
||||
*/
|
||||
normalizeSize(value, fallback) {
|
||||
const toPositiveNumber = (candidate) => {
|
||||
const num = Number(candidate);
|
||||
return Number.isFinite(num) && num > 0 ? num : null;
|
||||
};
|
||||
|
||||
const primary = toPositiveNumber(value);
|
||||
const secondary = toPositiveNumber(fallback);
|
||||
const safeValue = primary ?? secondary ?? 1;
|
||||
|
||||
return Math.max(1, Math.round(safeValue));
|
||||
},
|
||||
|
||||
/**
|
||||
* 随机字符串
|
||||
* @param len
|
||||
|
||||
@ -53,7 +53,7 @@
|
||||
"electron-store": "^8.2.0",
|
||||
"electron-updater": "^6.6.2",
|
||||
"express": "^5.1.0",
|
||||
"fastmcp": "^3.21.0",
|
||||
"fastmcp": "^3.24.0",
|
||||
"fs-extra": "^11.2.0",
|
||||
"marked": "^17.0.0",
|
||||
"pdf-lib": "^1.17.1",
|
||||
|
||||
@ -942,3 +942,5 @@ URL格式不正确
|
||||
选择模型
|
||||
请先配置 AI 助手
|
||||
请先在「AI 助手」设置中配置 OpenAI
|
||||
今日未完成的工作
|
||||
本周未完成的工作
|
||||
@ -1221,6 +1221,8 @@ OKR 结果分析
|
||||
未完成
|
||||
AI 机器人
|
||||
任务相关
|
||||
个人任务上限
|
||||
负责人或协助人的未完成任务数量上限,最大2000。
|
||||
请填写名称!
|
||||
使用代理
|
||||
支持 http 或 socks 代理
|
||||
@ -2261,4 +2263,14 @@ AI 分析已更新
|
||||
保存 AI 分析失败
|
||||
补充你想强调的重点或特殊说明,AI 将在此基础上整理汇报
|
||||
拖动卡片调整顺序,保存后仅自己可见
|
||||
恢复默认
|
||||
恢复默认
|
||||
|
||||
当前列表没有可归档的已完成任务
|
||||
归档已完成任务
|
||||
你确定将列表【(*)】中所有已完成的任务归档吗?
|
||||
已归档列表中所有已完成任务
|
||||
归档失败,请稍后再试
|
||||
|
||||
请输入 URL
|
||||
URL不能为空
|
||||
仅管理员可使用此功能
|
||||
|
||||
@ -32422,5 +32422,149 @@
|
||||
"fr": "Utilisateur",
|
||||
"id": "Pengguna",
|
||||
"ru": "Пользователь"
|
||||
},
|
||||
{
|
||||
"key": "当前列表没有可归档的已完成任务",
|
||||
"zh": "",
|
||||
"zh-CHT": "當前列表沒有可歸檔的已完成任務",
|
||||
"en": "There are no completed tasks in the current list that can be archived",
|
||||
"ko": "현재 목록에는 보관할 수 있는 완료된 작업이 없습니다",
|
||||
"ja": "現在のリストにはアーカイブ可能な完了タスクがありません",
|
||||
"de": "In der aktuellen Liste gibt es keine abgeschlossenen Aufgaben, die archiviert werden können",
|
||||
"fr": "Il n’y a aucune tâche terminée pouvant être archivée dans la liste actuelle",
|
||||
"id": "Tidak ada tugas selesai yang dapat diarsipkan dalam daftar saat ini",
|
||||
"ru": "В текущем списке нет завершённых задач, которые можно архивировать"
|
||||
},
|
||||
{
|
||||
"key": "归档已完成任务",
|
||||
"zh": "",
|
||||
"zh-CHT": "歸檔已完成任務",
|
||||
"en": "Archive completed tasks",
|
||||
"ko": "완료된 작업 보관",
|
||||
"ja": "完了タスクをアーカイブ",
|
||||
"de": "Abgeschlossene Aufgaben archivieren",
|
||||
"fr": "Archiver les tâches terminées",
|
||||
"id": "Arsipkan tugas yang selesai",
|
||||
"ru": "Архивировать завершённые задачи"
|
||||
},
|
||||
{
|
||||
"key": "你确定将列表【(*)】中所有已完成的任务归档吗?",
|
||||
"zh": "",
|
||||
"zh-CHT": "你確定將列表【(*)】中所有已完成的任務歸檔嗎?",
|
||||
"en": "Are you sure you want to archive all completed tasks in the list 【(*)】?",
|
||||
"ko": "목록 【(*)】의 모든 완료된 작업을 정말로 보관하시겠습니까?",
|
||||
"ja": "リスト【(*)】内のすべての完了タスクをアーカイブしてよろしいですか?",
|
||||
"de": "Möchten Sie wirklich alle abgeschlossenen Aufgaben in der Liste 【(*)】 archivieren?",
|
||||
"fr": "Voulez-vous vraiment archiver toutes les tâches terminées de la liste 【(*)】 ?",
|
||||
"id": "Anda yakin ingin mengarsipkan semua tugas yang sudah selesai di daftar 【(*)】?",
|
||||
"ru": "Вы уверены, что хотите архивировать все завершённые задачи в списке 【(*)】?"
|
||||
},
|
||||
{
|
||||
"key": "已归档列表中所有已完成任务",
|
||||
"zh": "",
|
||||
"zh-CHT": "已歸檔列表中所有已完成任務",
|
||||
"en": "All completed tasks in the list have been archived",
|
||||
"ko": "목록의 모든 완료된 작업이 보관되었습니다",
|
||||
"ja": "リスト内のすべての完了タスクをアーカイブしました",
|
||||
"de": "Alle abgeschlossenen Aufgaben in der Liste wurden archiviert",
|
||||
"fr": "Toutes les tâches terminées de la liste ont été archivées",
|
||||
"id": "Semua tugas yang selesai dalam daftar telah diarsipkan",
|
||||
"ru": "Все завершённые задачи в списке были архивированы"
|
||||
},
|
||||
{
|
||||
"key": "归档失败,请稍后再试",
|
||||
"zh": "",
|
||||
"zh-CHT": "歸檔失敗,請稍後再試",
|
||||
"en": "Archiving failed, please try again later",
|
||||
"ko": "보관에 실패했습니다. 나중에 다시 시도해주세요",
|
||||
"ja": "アーカイブに失敗しました。しばらくしてからもう一度お試しください",
|
||||
"de": "Archivierung fehlgeschlagen, bitte versuchen Sie es später erneut",
|
||||
"fr": "Échec de l’archivage, veuillez réessayer plus tard",
|
||||
"id": "Pengarsipan gagal, silakan coba lagi nanti",
|
||||
"ru": "Не удалось выполнить архивирование, повторите попытку позже"
|
||||
},
|
||||
{
|
||||
"key": "个人任务上限",
|
||||
"zh": "",
|
||||
"zh-CHT": "個人任務上限",
|
||||
"en": "Personal task limit",
|
||||
"ko": "개인 작업 한도",
|
||||
"ja": "個人タスク上限",
|
||||
"de": "Persönliches Aufgabenlimit",
|
||||
"fr": "Limite de tâches personnelles",
|
||||
"id": "Batas tugas pribadi",
|
||||
"ru": "Лимит личных задач"
|
||||
},
|
||||
{
|
||||
"key": "负责人或协助人的未完成任务数量上限,最大2000。",
|
||||
"zh": "",
|
||||
"zh-CHT": "負責人或協助人的未完成任務數量上限,最大 2000。",
|
||||
"en": "Maximum number of incomplete tasks for assignees or collaborators, up to 2000.",
|
||||
"ko": "담당자 또는 협력자의 미완료 작업 최대 개수로, 최대 2000개입니다.",
|
||||
"ja": "担当者または協力者が保有できる未完了タスク数の上限です。最大 2000 件までです。",
|
||||
"de": "Maximale Anzahl offener Aufgaben für Verantwortliche oder Mitwirkende, maximal 2000.",
|
||||
"fr": "Nombre maximal de tâches inachevées pour les responsables ou les collaborateurs, jusqu’à 2000.",
|
||||
"id": "Batas jumlah tugas yang belum selesai untuk penanggung jawab atau kolaborator, maksimum 2000.",
|
||||
"ru": "Предельное количество невыполненных задач для ответственных или соисполнителей — максимум 2000."
|
||||
},
|
||||
{
|
||||
"key": "请输入 URL",
|
||||
"zh": "",
|
||||
"zh-CHT": "請輸入 URL",
|
||||
"en": "Please enter the URL",
|
||||
"ko": "URL을 입력하세요",
|
||||
"ja": "URLを入力してください",
|
||||
"de": "Bitte die URL eingeben",
|
||||
"fr": "Veuillez saisir l’URL",
|
||||
"id": "Silakan masukkan URL",
|
||||
"ru": "Введите URL"
|
||||
},
|
||||
{
|
||||
"key": "URL不能为空",
|
||||
"zh": "",
|
||||
"zh-CHT": "URL 不能為空",
|
||||
"en": "URL cannot be empty",
|
||||
"ko": "URL은 비워 둘 수 없습니다",
|
||||
"ja": "URLを空にすることはできません",
|
||||
"de": "Die URL darf nicht leer sein",
|
||||
"fr": "L’URL ne peut pas être vide",
|
||||
"id": "URL tidak boleh kosong",
|
||||
"ru": "URL не может быть пустым"
|
||||
},
|
||||
{
|
||||
"key": "仅管理员可使用此功能",
|
||||
"zh": "",
|
||||
"zh-CHT": "僅管理員可使用此功能",
|
||||
"en": "Only administrators can use this feature",
|
||||
"ko": "이 기능은 관리자만 사용할 수 있습니다",
|
||||
"ja": "この機能を使用できるのは管理者のみです",
|
||||
"de": "Diese Funktion kann nur von Administratoren verwendet werden",
|
||||
"fr": "Seuls les administrateurs peuvent utiliser cette fonctionnalité",
|
||||
"id": "Fitur ini hanya dapat digunakan oleh administrator",
|
||||
"ru": "Эту функцию могут использовать только администраторы"
|
||||
},
|
||||
{
|
||||
"key": "今日未完成的工作",
|
||||
"zh": "",
|
||||
"zh-CHT": "今日未完成的工作",
|
||||
"en": "Today's incomplete tasks",
|
||||
"ko": "오늘 미완료된 작업",
|
||||
"ja": "本日未完了のタスク",
|
||||
"de": "Heutige unerledigte Aufgaben",
|
||||
"fr": "Tâches inachevées d’aujourd’hui",
|
||||
"id": "Tugas yang belum selesai hari ini",
|
||||
"ru": "Незавершённые задачи за сегодня"
|
||||
},
|
||||
{
|
||||
"key": "本周未完成的工作",
|
||||
"zh": "",
|
||||
"zh-CHT": "本週未完成的工作",
|
||||
"en": "This week's incomplete tasks",
|
||||
"ko": "이번 주 미완료된 작업",
|
||||
"ja": "今週未完了のタスク",
|
||||
"de": "In dieser Woche unerledigte Aufgaben",
|
||||
"fr": "Tâches inachevées de cette semaine",
|
||||
"id": "Tugas yang belum selesai minggu ini",
|
||||
"ru": "Незавершённые задачи за эту неделю"
|
||||
}
|
||||
]
|
||||
@ -174,8 +174,8 @@ if (count($needs) > 0) {
|
||||
$openAi->setProxy($openAiProxy);
|
||||
}
|
||||
$result = $openAi->chat([
|
||||
"model" => "gpt-5",
|
||||
"reasoning_effort" => "minimal",
|
||||
"model" => "gpt-5.1",
|
||||
"reasoning_effort" => "low",
|
||||
'messages' => [
|
||||
[
|
||||
"role" => "system",
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "DooTask",
|
||||
"version": "1.4.42",
|
||||
"codeVerson": 218,
|
||||
"version": "1.4.81",
|
||||
"codeVerson": 220,
|
||||
"description": "DooTask is task management system.",
|
||||
"scripts": {
|
||||
"start": "./cmd dev",
|
||||
|
||||
5
public/images/application/appstore-default.svg
Normal file
5
public/images/application/appstore-default.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
|
||||
<path d="M0 0m349.206261 0l325.587478 0q349.206261 0 349.206261 349.206261l0 325.587478q0 349.206261-349.206261 349.206261l-325.587478 0q-349.206261 0-349.206261-349.206261l0-325.587478q0-349.206261 349.206261-349.206261Z" fill="#84c56a" class="selected"></path>
|
||||
<path d="M442.189913 298.284522c9.728 0 18.053565 3.372522 24.976696 10.128695 6.912 6.745043 10.373565 14.981565 10.373565 24.731826v140.566261c0 9.750261-3.450435 18.086957-10.373565 25.021218a34.003478 34.003478 0 0 1-24.976696 10.395826H301.924174a33.090783 33.090783 0 0 1-24.698435-10.395826A34.626783 34.626783 0 0 1 267.130435 473.711304V333.145043c0-9.750261 3.361391-17.986783 10.095304-24.742956 6.733913-6.745043 14.970435-10.117565 24.698435-10.117565h140.265739zM442.189913 579.417043c9.728 0 18.053565 3.372522 24.976696 10.128696 6.912 6.733913 10.373565 14.981565 10.373565 24.731826v141.133913c0 9.73913-3.450435 17.986783-10.373565 24.731826-6.92313 6.745043-15.248696 10.128696-24.976696 10.128696H301.924174c-9.728 0-17.964522-3.383652-24.698435-10.128696C270.491826 773.398261 267.130435 765.150609 267.130435 755.400348V614.266435c0-9.73913 3.361391-17.986783 10.095304-24.731826 6.733913-6.745043 14.970435-10.128696 24.698435-10.128696h140.265739zM723.311304 579.417043c9.71687 0 17.953391 3.372522 24.687305 10.128696 6.733913 6.733913 10.095304 14.981565 10.095304 24.731826v141.133913c0 9.73913-3.361391 17.986783-10.095304 24.731826-6.733913 6.745043-14.970435 10.128696-24.687305 10.128696H583.034435a34.482087 34.482087 0 0 1-24.976696-10.128696 33.224348 33.224348 0 0 1-10.373565-24.742956V614.266435c0-9.73913 3.450435-17.986783 10.373565-24.731826a34.482087 34.482087 0 0 1 24.976696-10.128696h140.276869z" fill="#FFFFFF"></path>
|
||||
<path d="M667.826087 243.287534m23.611218 23.611218l110.185682 110.185682q23.611218 23.611218 0 47.222436l-110.185682 110.185683q-23.611218 23.611218-47.222436 0l-110.185683-110.185683q-23.611218-23.611218 0-47.222436l110.185683-110.185682q23.611218-23.611218 47.222436 0Z" fill="#FFFFFF" fill-opacity=".7"></path>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
1
public/js/build/404.342bbc36.js
vendored
Normal file
1
public/js/build/404.342bbc36.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{n as m}from"./app.c5553f1a.js";import"./jquery.1eb1c821.js";import"./@babel.ad55b12f.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./vue.baba6da0.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./view-design-hi.85d727e5.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.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 rt=function(){return _.exports}();export{rt as default};
|
||||
1
public/js/build/404.ed8bd33b.js
vendored
1
public/js/build/404.ed8bd33b.js
vendored
@ -1 +0,0 @@
|
||||
import{n as m}from"./app.ccb8a946.js";import"./jquery.5514bc0e.js";import"./@babel.f9bcab46.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./vue.fd9b772e.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./view-design-hi.75f80746.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.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 rt=function(){return _.exports}();export{rt as default};
|
||||
1
public/js/build/@babel.ad55b12f.js
vendored
Normal file
1
public/js/build/@babel.ad55b12f.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/js/build/@babel.f9bcab46.js
vendored
1
public/js/build/@babel.f9bcab46.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
15
public/js/build/@micro-zoe.cbc3b3ff.js
vendored
Normal file
15
public/js/build/@micro-zoe.cbc3b3ff.js
vendored
Normal file
File diff suppressed because one or more lines are too long
15
public/js/build/@micro-zoe.f728a9f4.js
vendored
15
public/js/build/@micro-zoe.f728a9f4.js
vendored
File diff suppressed because one or more lines are too long
263
public/js/build/@traptitech.561c583d.js
vendored
Normal file
263
public/js/build/@traptitech.561c583d.js
vendored
Normal file
File diff suppressed because one or more lines are too long
263
public/js/build/@traptitech.897ae552.js
vendored
263
public/js/build/@traptitech.897ae552.js
vendored
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
@ -1 +1 @@
|
||||
import{m as s}from"./vuex.cc7cb26e.js";import{I as m}from"./IFrame.5540c7ba.js";import{n as p,l as o}from"./app.ccb8a946.js";import"./jquery.5514bc0e.js";import"./@babel.f9bcab46.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./vue.fd9b772e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./view-design-hi.75f80746.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.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,"39021859",null,null);function h(t){for(let e in a)this[e]=a[e]}var mt=function(){return c.exports}();export{mt as default};
|
||||
import{m as s}from"./vuex.cc7cb26e.js";import{I as m}from"./IFrame.bee7d822.js";import{n as p,l as o}from"./app.c5553f1a.js";import"./jquery.1eb1c821.js";import"./@babel.ad55b12f.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./vue.baba6da0.js";import"./openpgp_hi.15f91b1d.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./view-design-hi.85d727e5.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.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,"39021859",null,null);function h(t){for(let e in a)this[e]=a[e]}var mt=function(){return c.exports}();export{mt as default};
|
||||
File diff suppressed because one or more lines are too long
1
public/js/build/FilePreview.363a8be4.js
vendored
1
public/js/build/FilePreview.363a8be4.js
vendored
File diff suppressed because one or more lines are too long
1
public/js/build/FilePreview.e0fea39f.js
vendored
Normal file
1
public/js/build/FilePreview.e0fea39f.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
import{n}from"./app.ccb8a946.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.c5553f1a.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
@ -1 +1 @@
|
||||
.component-only-office[data-v-7946f4cf]{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center}.component-only-office .placeholder[data-v-7946f4cf]{flex:1;width:100%;height:100%}.component-only-office .office-loading[data-v-7946f4cf]{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2}.component-only-office .load-error{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;padding:8px;display:flex;align-items:center}.component-only-office .load-error .ivu-alert-icon{position:static;margin-right:8px;margin-left:4px}
|
||||
.component-only-office[data-v-6f9d12ef]{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center}.component-only-office .placeholder[data-v-6f9d12ef]{flex:1;width:100%;height:100%}.component-only-office .office-loading[data-v-6f9d12ef]{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2}.component-only-office .load-error{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;padding:8px;display:flex;align-items:center}.component-only-office .load-error .ivu-alert-icon{position:static;margin-right:8px;margin-left:4px}
|
||||
1
public/js/build/OnlyOffice.ba262657.js
vendored
Normal file
1
public/js/build/OnlyOffice.ba262657.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/js/build/OnlyOffice.dbb72842.js
vendored
1
public/js/build/OnlyOffice.dbb72842.js
vendored
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
@ -1 +1 @@
|
||||
import{n as r}from"./app.ccb8a946.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.c5553f1a.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
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.b7699767.css
vendored
Normal file
7
public/js/build/app.b7699767.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
7
public/js/build/app.f654c998.css
vendored
7
public/js/build/app.f654c998.css
vendored
File diff suppressed because one or more lines are too long
1
public/js/build/application.11f98750.js
vendored
Normal file
1
public/js/build/application.11f98750.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/js/build/application.6fcd9439.js
vendored
1
public/js/build/application.6fcd9439.js
vendored
File diff suppressed because one or more lines are too long
1
public/js/build/apps.a4199287.js
vendored
Normal file
1
public/js/build/apps.a4199287.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{m}from"./vuex.cc7cb26e.js";import{M as e}from"./index.ac3c5851.js";import{n as a}from"./app.c5553f1a.js";import"./vue.baba6da0.js";import"./@babel.ad55b12f.js";import"./view-design-hi.85d727e5.js";import"./@micro-zoe.cbc3b3ff.js";import"./DialogWrapper.7ff331bb.js";import"./index.805d9e35.js";import"./vue-virtual-scroll-list-hi.aadd1a98.js";import"./lodash.2fa8f497.js";import"./ImgUpload.46aa97c0.js";import"./webhook.378987f3.js";import"./jquery.1eb1c821.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./openpgp_hi.15f91b1d.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.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,url_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 l=a(u,n,s,!1,c,null,null,null);function c(t){for(let o in p)this[o]=p[o]}var cr=function(){return l.exports}();export{cr as default};
|
||||
1
public/js/build/apps.c4aa6ee5.js
vendored
1
public/js/build/apps.c4aa6ee5.js
vendored
@ -1 +0,0 @@
|
||||
import{M as i}from"./index.9160b772.js";import{n as m}from"./app.ccb8a946.js";import"./vue.fd9b772e.js";import"./@babel.f9bcab46.js";import"./vuex.cc7cb26e.js";import"./view-design-hi.75f80746.js";import"./@micro-zoe.f728a9f4.js";import"./DialogWrapper.484e7fa4.js";import"./index.867a6d9a.js";import"./vue-virtual-scroll-list-hi.15e3c1fb.js";import"./lodash.18c5398d.js";import"./ImgUpload.69c00ad7.js";import"./webhook.378987f3.js";import"./jquery.5514bc0e.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./openpgp_hi.15f91b1d.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var e=function(){var t=this,r=t.$createElement,o=t._self._c||r;return o("MicroApps",{ref:"app",attrs:{"window-type":"popout"}})},n=[];const a={components:{MicroApps:i},async mounted(){const{name:t}=this.$route.params;if(!t){$A.modalError("\u5E94\u7528\u4E0D\u5B58\u5728");return}const r=(await $A.IDBArray("cacheMicroApps")).reverse().find(o=>o.name===t);if(!r){$A.modalError("\u5E94\u7528\u4E0D\u5B58\u5728");return}await this.$refs.app.onOpen(r)}},p={};var s=m(a,e,n,!1,c,null,null,null);function c(t){for(let r in p)this[r]=p[r]}var cr=function(){return s.exports}();export{cr as default};
|
||||
File diff suppressed because one or more lines are too long
6
public/js/build/axios.554fcc10.js
vendored
Normal file
6
public/js/build/axios.554fcc10.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
public/js/build/axios.79c8b3d5.js
vendored
6
public/js/build/axios.79c8b3d5.js
vendored
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
@ -1,4 +1,4 @@
|
||||
import{c as M}from"./@babel.f9bcab46.js";var P={exports:{}};/*!
|
||||
import{c as M}from"./@babel.ad55b12f.js";var P={exports:{}};/*!
|
||||
* clipboard.js v2.0.11
|
||||
* https://clipboardjs.com/
|
||||
*
|
||||
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/dayjs.95b8823d.js
vendored
1
public/js/build/dayjs.95b8823d.js
vendored
File diff suppressed because one or more lines are too long
1
public/js/build/dayjs.d2ace94a.js
vendored
Normal file
1
public/js/build/dayjs.d2ace94a.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 +1 @@
|
||||
import{n as l}from"./app.ccb8a946.js";import"./jquery.5514bc0e.js";import"./@babel.f9bcab46.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./vue.fd9b772e.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./view-design-hi.75f80746.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.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 ot=function(){return u.exports}();export{ot as default};
|
||||
import{n as l}from"./app.c5553f1a.js";import"./jquery.1eb1c821.js";import"./@babel.ad55b12f.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./vue.baba6da0.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./view-design-hi.85d727e5.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.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 ot=function(){return u.exports}();export{ot as default};
|
||||
1
public/js/build/dialog.a0222938.js
vendored
Normal file
1
public/js/build/dialog.a0222938.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{D as p}from"./DialogWrapper.7ff331bb.js";import{m}from"./vuex.cc7cb26e.js";import{n as a}from"./app.c5553f1a.js";import"./index.805d9e35.js";import"./vue-virtual-scroll-list-hi.aadd1a98.js";import"./@babel.ad55b12f.js";import"./vue.baba6da0.js";import"./lodash.2fa8f497.js";import"./ImgUpload.46aa97c0.js";import"./webhook.378987f3.js";import"./jquery.1eb1c821.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./openpgp_hi.15f91b1d.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./view-design-hi.85d727e5.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.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 st=function(){return l.exports}();export{st as default};
|
||||
1
public/js/build/dialog.b02a56d5.js
vendored
1
public/js/build/dialog.b02a56d5.js
vendored
@ -1 +0,0 @@
|
||||
import{D as p}from"./DialogWrapper.484e7fa4.js";import{m}from"./vuex.cc7cb26e.js";import{n as a}from"./app.ccb8a946.js";import"./index.867a6d9a.js";import"./vue-virtual-scroll-list-hi.15e3c1fb.js";import"./@babel.f9bcab46.js";import"./vue.fd9b772e.js";import"./lodash.18c5398d.js";import"./ImgUpload.69c00ad7.js";import"./webhook.378987f3.js";import"./jquery.5514bc0e.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./openpgp_hi.15f91b1d.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./view-design-hi.75f80746.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.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 st=function(){return l.exports}();export{st as default};
|
||||
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
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
@ -1 +1 @@
|
||||
import n from"./FileContent.ac655b7b.js";import l from"./FilePreview.363a8be4.js";import{n as m}from"./app.ccb8a946.js";import"./openpgp_hi.15f91b1d.js";import"./IFrame.5540c7ba.js";import"./jquery.5514bc0e.js";import"./@babel.f9bcab46.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./vue.fd9b772e.js";import"./vuex.cc7cb26e.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./view-design-hi.75f80746.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.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:l,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=m(a,s,p,!1,u,"662d0b64",null,null);function u(t){for(let e in o)this[e]=o[e]}var mt=function(){return f.exports}();export{mt as default};
|
||||
import n from"./FileContent.84e52897.js";import l from"./FilePreview.e0fea39f.js";import{n as m}from"./app.c5553f1a.js";import"./openpgp_hi.15f91b1d.js";import"./IFrame.bee7d822.js";import"./jquery.1eb1c821.js";import"./@babel.ad55b12f.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./vue.baba6da0.js";import"./vuex.cc7cb26e.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./view-design-hi.85d727e5.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.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:l,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=m(a,s,p,!1,u,"662d0b64",null,null);function u(t){for(let e in o)this[e]=o[e]}var mt=function(){return f.exports}();export{mt as default};
|
||||
1
public/js/build/fileMsg.116ed34e.js
vendored
Normal file
1
public/js/build/fileMsg.116ed34e.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/js/build/fileMsg.9e8a712d.js
vendored
1
public/js/build/fileMsg.9e8a712d.js
vendored
File diff suppressed because one or more lines are too long
1
public/js/build/fileTask.d88e7f15.js
vendored
1
public/js/build/fileTask.d88e7f15.js
vendored
File diff suppressed because one or more lines are too long
1
public/js/build/fileTask.ee46cc6c.js
vendored
Normal file
1
public/js/build/fileTask.ee46cc6c.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
public/js/build/highlight.js.ab8aeea4.js
vendored
9
public/js/build/highlight.js.ab8aeea4.js
vendored
File diff suppressed because one or more lines are too long
10
public/js/build/highlight.js.cbbfb885.js
vendored
Normal file
10
public/js/build/highlight.js.cbbfb885.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@
|
||||
import{c as it,g as at}from"./@babel.f9bcab46.js";var G={exports:{}};(function($,ut){(function(_,s){$.exports=s()})(it,function(){return function(_){var s={};function p(l){if(s[l])return s[l].exports;var f=s[l]={i:l,l:!1,exports:{}};return _[l].call(f.exports,f,f.exports,p),f.l=!0,f.exports}return p.m=_,p.c=s,p.d=function(l,f,c){p.o(l,f)||Object.defineProperty(l,f,{enumerable:!0,get:c})},p.r=function(l){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(l,"__esModule",{value:!0})},p.t=function(l,f){if(1&f&&(l=p(l)),8&f||4&f&&typeof l=="object"&&l&&l.__esModule)return l;var c=Object.create(null);if(p.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:l}),2&f&&typeof l!="string")for(var i in l)p.d(c,i,function(t){return l[t]}.bind(null,i));return c},p.n=function(l){var f=l&&l.__esModule?function(){return l.default}:function(){return l};return p.d(f,"a",f),f},p.o=function(l,f){return Object.prototype.hasOwnProperty.call(l,f)},p.p="",p(p.s=46)}([function(_,s,p){Object.defineProperty(s,"__esModule",{value:!0});var l=p(1),f=p(12),c=p(6),i=p(7),t=p(2),e=function(){function o(n,a,r){var u=r===void 0?{}:r,h=u.keepSpace,d=h!==void 0&&h,y=u.prevTagName,v=y===void 0?"":y,g=u.nextTagName,b=g===void 0?"":g,O=u.prevTagStr,T=O===void 0?"":O,x=u.nextTagStr,j=x===void 0?"":x,P=u.parentTag,S=P===void 0?"":P,m=u.isFirstSubTag,w=m===void 0||m,M=u.calcLeading,E=M!==void 0&&M,C=u.leadingSpace,N=C===void 0?"":C,L=u.layer,J=L===void 0?1:L,A=u.noWrap,z=A!==void 0&&A,H=u.prevHasEndSpace,K=H!==void 0&&H,W=u.prevHasStartSpace,Y=W!==void 0&&W,V=u.match,Z=V===void 0?null:V,R=u.indentSpace,Q=R===void 0?"":R,I=u.language,X=I===void 0?"":I,D=u.count,tt=D===void 0?1:D,q=u.tableColumnCount,et=q===void 0?0:q,U=u.noExtraLine,nt=U!==void 0&&U,B=u.inTable,ot=B!==void 0&&B;if(this.tagName=a,this.rawStr=n,this.parentTag=S,this.prevTagName=v,this.nextTagName=b,this.prevTagStr=T,this.nextTagStr=j,this.isFirstSubTag=w,this.calcLeading=E,this.leadingSpace=N,this.layer=J,this.noWrap=z,this.match=Z,this.indentSpace=Q,this.language=X,this.count=tt,this.inTable=ot,this.tableColumnCount=et,this.noExtraLine=nt,this.prevHasEndSpace=K,this.prevHasStartSpace=Y,this.hasStartSpace=!1,this.hasEndSpace=!1,this.keepSpace=d,!this.__detectStr__(n,this.tagName))return this.attrs={},void(this.innerHTML="");var F=this.__fetchTagAttrAndInnerHTML__(n),rt=F.attr,k=F.innerHTML;k.startsWith(" ")&&(0,l.isSpacePassingTag)(a)&&(this.hasStartSpace=!0),k.endsWith(" ")&&(0,l.isSpacePassingTag)(a)&&(this.hasEndSpace=!0),this.attrs=rt,this.innerHTML=k}return o.prototype.__detectStr__=function(n,a){if(n[0]!=="<")return"Not a valid tag, current tag name: ".concat(this.tagName,", tag content: ").concat(n),!1;for(var r="",u=!1,h=1;h<n.length&&n[h]!==">";h++)!u&&/(\s|\/)/.test(n[h])&&(u=!0),u||(r+=n[h]);return r===a},o.prototype.__fetchTagAttrAndInnerHTML__=function(n){for(var a="",r=1;r<n.length&&n[r]!==">";r++)a+=n[r];for(var u=n.slice(r+1),h="",d=-1,y=u.length-1;y>=0;y--)if((h=u[y]+h).startsWith("</")){h.startsWith("</"+this.tagName+">")&&(d=y);break}d===-1&&(0,l.isSelfClosing)(this.tagName)&&this.tagName;var v=(0,l.getTagAttributes)(a);return this.tagName&&delete v[this.tagName],{attr:v,innerHTML:u.slice(0,d)}},o.prototype.__onlyLeadingSpace__=function(n){n=n.trim();for(var a=0;a<n.length;a++)if(n[a]!==c.SINGLE)return!1;return!0},o.prototype.__isEmpty__=function(n){return!this.keepSpace&&(n===""&&this.tagName!=="td"||this.calcLeading&&this.__onlyLeadingSpace__(n))},o.prototype.getValidSubTagName=function(n){return n},o.prototype.beforeParse=function(){var n=t.default.get().tagListener;if(n){var a=n(this.tagName,{parentTag:this.parentTag,prevTagName:this.prevTagName,nextTagName:this.nextTagName,isFirstSubTag:this.isFirstSubTag,attrs:this.attrs,innerHTML:this.innerHTML,language:this.language,match:this.match,isSelfClosing:!1}),r=a.attrs,u=a.language,h=a.match;this.attrs=r,typeof u=="string"&&(this.language=u),typeof h!="undefined"&&(this.match=h)}return""},o.prototype.parseValidSubTag=function(n,a,r){var u=new((0,l.getTagConstructor)(a))(n,a,r);return[u.exec(),u]},o.prototype.parseOnlyString=function(n,a,r){var u=new f.default(n,a,r);return[u.exec(),u]},o.prototype.afterParsed=function(n){return n},o.prototype.slim=function(n){return this.keepSpace?n:n.trim()},o.prototype.beforeMergeSpace=function(n){return n},o.prototype.mergeSpace=function(n,a,r){return this.keepSpace&&this.tagName!=="pre"?n.endsWith(`
|
||||
import{c as it,g as at}from"./@babel.ad55b12f.js";var G={exports:{}};(function($,ut){(function(_,s){$.exports=s()})(it,function(){return function(_){var s={};function p(l){if(s[l])return s[l].exports;var f=s[l]={i:l,l:!1,exports:{}};return _[l].call(f.exports,f,f.exports,p),f.l=!0,f.exports}return p.m=_,p.c=s,p.d=function(l,f,c){p.o(l,f)||Object.defineProperty(l,f,{enumerable:!0,get:c})},p.r=function(l){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(l,"__esModule",{value:!0})},p.t=function(l,f){if(1&f&&(l=p(l)),8&f||4&f&&typeof l=="object"&&l&&l.__esModule)return l;var c=Object.create(null);if(p.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:l}),2&f&&typeof l!="string")for(var i in l)p.d(c,i,function(t){return l[t]}.bind(null,i));return c},p.n=function(l){var f=l&&l.__esModule?function(){return l.default}:function(){return l};return p.d(f,"a",f),f},p.o=function(l,f){return Object.prototype.hasOwnProperty.call(l,f)},p.p="",p(p.s=46)}([function(_,s,p){Object.defineProperty(s,"__esModule",{value:!0});var l=p(1),f=p(12),c=p(6),i=p(7),t=p(2),e=function(){function o(n,a,r){var u=r===void 0?{}:r,h=u.keepSpace,d=h!==void 0&&h,y=u.prevTagName,v=y===void 0?"":y,g=u.nextTagName,b=g===void 0?"":g,O=u.prevTagStr,T=O===void 0?"":O,x=u.nextTagStr,j=x===void 0?"":x,P=u.parentTag,S=P===void 0?"":P,m=u.isFirstSubTag,w=m===void 0||m,M=u.calcLeading,E=M!==void 0&&M,C=u.leadingSpace,N=C===void 0?"":C,L=u.layer,J=L===void 0?1:L,A=u.noWrap,z=A!==void 0&&A,H=u.prevHasEndSpace,K=H!==void 0&&H,W=u.prevHasStartSpace,Y=W!==void 0&&W,V=u.match,Z=V===void 0?null:V,R=u.indentSpace,Q=R===void 0?"":R,I=u.language,X=I===void 0?"":I,D=u.count,tt=D===void 0?1:D,q=u.tableColumnCount,et=q===void 0?0:q,U=u.noExtraLine,nt=U!==void 0&&U,B=u.inTable,ot=B!==void 0&&B;if(this.tagName=a,this.rawStr=n,this.parentTag=S,this.prevTagName=v,this.nextTagName=b,this.prevTagStr=T,this.nextTagStr=j,this.isFirstSubTag=w,this.calcLeading=E,this.leadingSpace=N,this.layer=J,this.noWrap=z,this.match=Z,this.indentSpace=Q,this.language=X,this.count=tt,this.inTable=ot,this.tableColumnCount=et,this.noExtraLine=nt,this.prevHasEndSpace=K,this.prevHasStartSpace=Y,this.hasStartSpace=!1,this.hasEndSpace=!1,this.keepSpace=d,!this.__detectStr__(n,this.tagName))return this.attrs={},void(this.innerHTML="");var F=this.__fetchTagAttrAndInnerHTML__(n),rt=F.attr,k=F.innerHTML;k.startsWith(" ")&&(0,l.isSpacePassingTag)(a)&&(this.hasStartSpace=!0),k.endsWith(" ")&&(0,l.isSpacePassingTag)(a)&&(this.hasEndSpace=!0),this.attrs=rt,this.innerHTML=k}return o.prototype.__detectStr__=function(n,a){if(n[0]!=="<")return"Not a valid tag, current tag name: ".concat(this.tagName,", tag content: ").concat(n),!1;for(var r="",u=!1,h=1;h<n.length&&n[h]!==">";h++)!u&&/(\s|\/)/.test(n[h])&&(u=!0),u||(r+=n[h]);return r===a},o.prototype.__fetchTagAttrAndInnerHTML__=function(n){for(var a="",r=1;r<n.length&&n[r]!==">";r++)a+=n[r];for(var u=n.slice(r+1),h="",d=-1,y=u.length-1;y>=0;y--)if((h=u[y]+h).startsWith("</")){h.startsWith("</"+this.tagName+">")&&(d=y);break}d===-1&&(0,l.isSelfClosing)(this.tagName)&&this.tagName;var v=(0,l.getTagAttributes)(a);return this.tagName&&delete v[this.tagName],{attr:v,innerHTML:u.slice(0,d)}},o.prototype.__onlyLeadingSpace__=function(n){n=n.trim();for(var a=0;a<n.length;a++)if(n[a]!==c.SINGLE)return!1;return!0},o.prototype.__isEmpty__=function(n){return!this.keepSpace&&(n===""&&this.tagName!=="td"||this.calcLeading&&this.__onlyLeadingSpace__(n))},o.prototype.getValidSubTagName=function(n){return n},o.prototype.beforeParse=function(){var n=t.default.get().tagListener;if(n){var a=n(this.tagName,{parentTag:this.parentTag,prevTagName:this.prevTagName,nextTagName:this.nextTagName,isFirstSubTag:this.isFirstSubTag,attrs:this.attrs,innerHTML:this.innerHTML,language:this.language,match:this.match,isSelfClosing:!1}),r=a.attrs,u=a.language,h=a.match;this.attrs=r,typeof u=="string"&&(this.language=u),typeof h!="undefined"&&(this.match=h)}return""},o.prototype.parseValidSubTag=function(n,a,r){var u=new((0,l.getTagConstructor)(a))(n,a,r);return[u.exec(),u]},o.prototype.parseOnlyString=function(n,a,r){var u=new f.default(n,a,r);return[u.exec(),u]},o.prototype.afterParsed=function(n){return n},o.prototype.slim=function(n){return this.keepSpace?n:n.trim()},o.prototype.beforeMergeSpace=function(n){return n},o.prototype.mergeSpace=function(n,a,r){return this.keepSpace&&this.tagName!=="pre"?n.endsWith(`
|
||||
`)?n:n+r.replace(/\n+/g,`
|
||||
`):a+n+r},o.prototype.afterMergeSpace=function(n){return n},o.prototype.beforeReturn=function(n){return!((0,l.isSpacePassingTag)(this.prevTagName)&&this.prevHasEndSpace||(0,l.isSpacePassingTag)(this.tagName)&&this.hasStartSpace)||/^\s+/.test(n)||/\s+$/.test(this.prevTagStr)?n:" "+n},o.prototype.exec=function(n,a){n===void 0&&(n=""),a===void 0&&(a="");for(var r=this.beforeParse(),u=(0,l.generateGetNextValidTag)(this.innerHTML),h=u(),d=h[0],y=h[1],v=null,g=!1,b=!1;y!=="";){var O,T=u(),x=T[0],j=T[1],P={parentTag:this.tagName,nextTagName:x,nextTagStr:j,prevTagName:v,prevTagStr:r,prevHasEndSpace:b,prevHasStartSpace:g,leadingSpace:this.leadingSpace,layer:this.layer,keepSpace:this.keepSpace,inTable:this.inTable,calcLeading:(this.tagName==="li"||this.tagName==="ol"||this.tagName==="ul")&&this.calcLeading},S=void 0,m=void 0;d!=null?(S=(O=this.parseValidSubTag(y,d,P))[0],m=O[1]):(S=(O=this.parseOnlyString(y,d,P))[0],m=O[1]),b=(m==null?void 0:m.hasEndSpace)||!1,g=(m==null?void 0:m.hasStartSpace)||!1;var w=this.getValidSubTagName(d);d=x,y=j,w==null&&this.__isEmpty__(S)||(!this.keepSpace&&(0,i.default)(v)&&(0,i.default)(w)&&(r=r.replace(/\n+$/,`
|
||||
`),S=S.replace(/^\n+/,`
|
||||
1
public/js/build/index.1a8bc070.js
vendored
Normal file
1
public/js/build/index.1a8bc070.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{_ as m}from"./openpgp_hi.15f91b1d.js";import{e as n}from"./index.40a8e116.js";import{n as p}from"./app.c5553f1a.js";import"./jquery.1eb1c821.js";import"./@babel.ad55b12f.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./vue.baba6da0.js";import"./vuex.cc7cb26e.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./view-design-hi.85d727e5.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.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.a2d3b720.js"),["js/build/editor.a2d3b720.js","js/build/editor.90492550.css","js/build/@kangc.12b15229.js","js/build/@kangc.d8464d83.css","js/build/@babel.ad55b12f.js","js/build/vue.baba6da0.js","js/build/copy-to-clipboard.a53c061d.js","js/build/toggle-selection.d2487283.js","js/build/prismjs.069537ae.js","js/build/app.c5553f1a.js","js/build/app.b7699767.css","js/build/jquery.1eb1c821.js","js/build/dayjs.d2ace94a.js","js/build/localforage.659d76c1.js","js/build/markdown-it.bda97caf.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.561c583d.js","js/build/vuex.cc7cb26e.js","js/build/openpgp_hi.15f91b1d.js","js/build/axios.554fcc10.js","js/build/mitt.1ea0a2a3.js","js/build/quill-hi.978f208d.js","js/build/parchment.d5c5924e.js","js/build/quill-delta.4f1e4697.js","js/build/fast-diff.f17881f3.js","js/build/lodash.clonedeep.8fb065bb.js","js/build/lodash.isequal.84238944.js","js/build/eventemitter3.78b735ad.js","js/build/lodash-es.df04b444.js","js/build/quill-mention-hi.2a6582e4.js","js/build/view-design-hi.85d727e5.js","js/build/html-to-md.96d5de37.js","js/build/vue-router.2d566cd7.js","js/build/vue-clipboard2.89894d1b.js","js/build/clipboard.6caea48c.js","js/build/vuedraggable.e8809463.js","js/build/sortablejs.b1e23af3.js","js/build/vue-resize-observer.df5b985e.js","js/build/element-sea.9d03b085.js","js/build/deepmerge.cecf392e.js","js/build/resize-observer-polyfill.18409ee0.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.e1b191c9.js","js/build/babel-runtime.4773988a.js","js/build/core-js.314b4a1d.js","js/build/codemirror.99a3984d.js","js/build/codemirror.9ace6687.css","js/build/index.40a8e116.js","js/build/ImgUpload.46aa97c0.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 mt=function(){return c.exports}();export{mt as default};
|
||||
@ -1 +1 @@
|
||||
import{n as e}from"./app.ccb8a946.js";import"./jquery.5514bc0e.js";import"./@babel.f9bcab46.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./vue.fd9b772e.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./view-design-hi.75f80746.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var m=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=e(p,m,n,!1,s,null,null,null);function s(t){for(let o in r)this[o]=r[o]}var ot=function(){return a.exports}();export{ot as default};
|
||||
import{n as e}from"./app.c5553f1a.js";import"./jquery.1eb1c821.js";import"./@babel.ad55b12f.js";import"./dayjs.d2ace94a.js";import"./localforage.659d76c1.js";import"./markdown-it.bda97caf.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.561c583d.js";import"./vue.baba6da0.js";import"./vuex.cc7cb26e.js";import"./openpgp_hi.15f91b1d.js";import"./axios.554fcc10.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.978f208d.js";import"./parchment.d5c5924e.js";import"./quill-delta.4f1e4697.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.8fb065bb.js";import"./lodash.isequal.84238944.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.2a6582e4.js";import"./view-design-hi.85d727e5.js";import"./html-to-md.96d5de37.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.89894d1b.js";import"./clipboard.6caea48c.js";import"./vuedraggable.e8809463.js";import"./sortablejs.b1e23af3.js";import"./vue-resize-observer.df5b985e.js";import"./element-sea.9d03b085.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.18409ee0.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.e1b191c9.js";import"./babel-runtime.4773988a.js";import"./core-js.314b4a1d.js";var m=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=e(p,m,n,!1,s,null,null,null);function s(t){for(let o in r)this[o]=r[o]}var ot=function(){return a.exports}();export{ot as default};
|
||||
1
public/js/build/index.2b1ef381.js
vendored
1
public/js/build/index.2b1ef381.js
vendored
@ -1 +0,0 @@
|
||||
import{_ as m}from"./openpgp_hi.15f91b1d.js";import{e as n}from"./index.40a8e116.js";import{n as p}from"./app.ccb8a946.js";import"./jquery.5514bc0e.js";import"./@babel.f9bcab46.js";import"./dayjs.95b8823d.js";import"./localforage.06336fb0.js";import"./markdown-it.bda97caf.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.ab8aeea4.js";import"./markdown-it-link-attributes.e1d5d151.js";import"./@traptitech.897ae552.js";import"./vue.fd9b772e.js";import"./vuex.cc7cb26e.js";import"./axios.79c8b3d5.js";import"./mitt.1ea0a2a3.js";import"./quill-hi.654cb53d.js";import"./parchment.d5c5924e.js";import"./quill-delta.f1b7ce48.js";import"./fast-diff.f17881f3.js";import"./lodash.clonedeep.e8ef3f14.js";import"./lodash.isequal.d6a986d0.js";import"./eventemitter3.78b735ad.js";import"./lodash-es.df04b444.js";import"./quill-mention-hi.41f02fd4.js";import"./view-design-hi.75f80746.js";import"./html-to-md.8a9a8796.js";import"./vue-router.2d566cd7.js";import"./vue-clipboard2.50be9c5e.js";import"./clipboard.058ef547.js";import"./vuedraggable.9fd6afed.js";import"./sortablejs.d74243d9.js";import"./vue-resize-observer.c3c9ca4e.js";import"./element-sea.1d49e96e.js";import"./deepmerge.cecf392e.js";import"./resize-observer-polyfill.0bdc1850.js";import"./throttle-debounce.7c3948b2.js";import"./babel-helper-vue-jsx-merge-props.5ed215c3.js";import"./normalize-wheel.2a034b9f.js";import"./async-validator.49abba38.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.dba31a5f.js"),["js/build/editor.dba31a5f.js","js/build/editor.90492550.css","js/build/@kangc.92e0b796.js","js/build/@kangc.d8464d83.css","js/build/@babel.f9bcab46.js","js/build/vue.fd9b772e.js","js/build/copy-to-clipboard.a53c061d.js","js/build/toggle-selection.d2487283.js","js/build/prismjs.ed627128.js","js/build/app.ccb8a946.js","js/build/app.f654c998.css","js/build/jquery.5514bc0e.js","js/build/dayjs.95b8823d.js","js/build/localforage.06336fb0.js","js/build/markdown-it.bda97caf.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.ab8aeea4.js","js/build/markdown-it-link-attributes.e1d5d151.js","js/build/@traptitech.897ae552.js","js/build/vuex.cc7cb26e.js","js/build/openpgp_hi.15f91b1d.js","js/build/axios.79c8b3d5.js","js/build/mitt.1ea0a2a3.js","js/build/quill-hi.654cb53d.js","js/build/parchment.d5c5924e.js","js/build/quill-delta.f1b7ce48.js","js/build/fast-diff.f17881f3.js","js/build/lodash.clonedeep.e8ef3f14.js","js/build/lodash.isequal.d6a986d0.js","js/build/eventemitter3.78b735ad.js","js/build/lodash-es.df04b444.js","js/build/quill-mention-hi.41f02fd4.js","js/build/view-design-hi.75f80746.js","js/build/html-to-md.8a9a8796.js","js/build/vue-router.2d566cd7.js","js/build/vue-clipboard2.50be9c5e.js","js/build/clipboard.058ef547.js","js/build/vuedraggable.9fd6afed.js","js/build/sortablejs.d74243d9.js","js/build/vue-resize-observer.c3c9ca4e.js","js/build/element-sea.1d49e96e.js","js/build/deepmerge.cecf392e.js","js/build/resize-observer-polyfill.0bdc1850.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.49abba38.js","js/build/babel-runtime.4773988a.js","js/build/core-js.314b4a1d.js","js/build/codemirror.8cc0d7e8.js","js/build/codemirror.9ace6687.css","js/build/index.40a8e116.js","js/build/ImgUpload.69c00ad7.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 mt=function(){return c.exports}();export{mt as default};
|
||||
1
public/js/build/index.53ccedb1.css
vendored
1
public/js/build/index.53ccedb1.css
vendored
File diff suppressed because one or more lines are too long
1
public/js/build/index.606b6ae8.css
vendored
Normal file
1
public/js/build/index.606b6ae8.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
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
Loading…
x
Reference in New Issue
Block a user