hedwi-app-menu 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # hedwi-app-menu
1
+ # bind-app-menu
2
2
 
3
3
  应用菜单组件库,用于在多个项目中复用「更多应用」下拉菜单(Mail、Contacts、Calendar、Chat、Drive 等)。
4
4
 
@@ -7,7 +7,7 @@
7
7
  在 `app.module.ts` 中:
8
8
 
9
9
  ```ts
10
- import { HedwiAppMenuModule } from "../../projects/hedwi-app-menu/src/public-api";
10
+ import { HedwiAppMenuModule } from "../../projects/bind-app-menu/src/public-api";
11
11
 
12
12
  @NgModule({
13
13
  imports: [ ..., HedwiAppMenuModule ],
@@ -19,17 +19,17 @@ import { HedwiAppMenuModule } from "../../projects/hedwi-app-menu/src/public-api
19
19
 
20
20
  ```html
21
21
  <mat-menu #appMenu="matMenu" class="app-menu">
22
- <hedwi-app-menu
22
+ <bind-app-menu
23
23
  [baseUrl]="environment.baseurl"
24
24
  [cacheTs]="cacheTs"
25
- ></hedwi-app-menu>
25
+ ></bind-app-menu>
26
26
  </mat-menu>
27
27
  ```
28
28
 
29
29
  ## 在其它项目中使用
30
30
 
31
- 1. **复制库目录**:将 `projects/hedwi-app-menu` 复制到目标项目的 `projects/` 下,并在目标项目中用相对路径或 path 引用 `public-api`。
32
- 2. **发布为 npm 包**(可选):在库目录执行 `ng build hedwi-app-menu`(需在 angular.json 中注册该库项目),将 `dist/hedwi-app-menu` 发布后,在其它项目中 `npm i hedwi-app-menu` 并 `import { HedwiAppMenuModule } from 'hedwi-app-menu'`。
31
+ 1. **复制库目录**:将 `projects/bind-app-menu` 复制到目标项目的 `projects/` 下,并在目标项目中用相对路径或 path 引用 `public-api`。
32
+ 2. **发布为 npm 包**(可选):在库目录执行 `ng build bind-app-menu`(需在 angular.json 中注册该库项目),将 `dist/bind-app-menu` 发布后,在其它项目中 `npm i bind-app-menu` 并 `import { HedwiAppMenuModule } from 'bind-app-menu'`。
33
33
 
34
34
  ## API
35
35
 
@@ -10,13 +10,20 @@ export class AppMenuComponent {
10
10
  this.cacheTs = '';
11
11
  /** 应用列表,不传则使用默认列表 */
12
12
  this.apps = HEDWI_APP_MENU_DEFAULT_APPS;
13
+ /** 界面语言:优先 names[language],缺省时回退 name(通常为 en-us) */
14
+ this.language = 'en-us';
15
+ /** 按 groupIndex 分组后的列表(仅当 apps 变化时重新计算,避免每次变更检测返回新数组导致图片循环请求) */
16
+ this.appGroups = [];
13
17
  }
14
- /** 返回应用显示名称 */
15
- displayName(item) {
16
- return item.name;
18
+ ngOnInit() {
19
+ this.appGroups = this.buildAppGroups();
17
20
  }
18
- /** 按 groupIndex 分组,用于按行渲染 */
19
- get appGroups() {
21
+ ngOnChanges(changes) {
22
+ if (changes['apps']) {
23
+ this.appGroups = this.buildAppGroups();
24
+ }
25
+ }
26
+ buildAppGroups() {
20
27
  const map = new Map();
21
28
  for (const item of this.apps) {
22
29
  const g = item.groupIndex ?? (item.extra ? 1 : 0);
@@ -27,6 +34,18 @@ export class AppMenuComponent {
27
34
  const maxG = Math.max(0, ...map.keys());
28
35
  return Array.from({ length: maxG + 1 }, (_, i) => map.get(i) ?? []);
29
36
  }
37
+ /** trackBy:按分组索引,避免无意义的 DOM 重建 */
38
+ trackByGroupIndex(index, _group) {
39
+ return index;
40
+ }
41
+ /** trackBy:按 path 唯一标识应用项,避免无意义的 DOM 重建与图片重复请求 */
42
+ trackByItemPath(index, item) {
43
+ return item.path;
44
+ }
45
+ /** 返回应用显示名称 */
46
+ displayName(item) {
47
+ return item.names?.[this.language] ?? item.name;
48
+ }
30
49
  iconUrl(item) {
31
50
  const base = (this.baseUrl || '').replace(/\/$/, '');
32
51
  const path = `${base}/mail/assets/images/${item.icon}`;
@@ -39,16 +58,18 @@ export class AppMenuComponent {
39
58
  return this.cacheTs ? `${fullPath}${sep}v=${this.cacheTs}` : fullPath;
40
59
  }
41
60
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppMenuComponent, selector: "hedwi-app-menu", inputs: { baseUrl: "baseUrl", cacheTs: "cacheTs", apps: "apps" }, ngImport: i0, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
61
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppMenuComponent, selector: "hedwi-app-menu", inputs: { baseUrl: "baseUrl", cacheTs: "cacheTs", apps: "apps", language: "language" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups; trackBy: trackByGroupIndex\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group; trackBy: trackByItemPath\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
43
62
  }
44
63
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, decorators: [{
45
64
  type: Component,
46
- args: [{ selector: 'hedwi-app-menu', standalone: false, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"] }]
65
+ args: [{ selector: 'hedwi-app-menu', standalone: false, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups; trackBy: trackByGroupIndex\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group; trackBy: trackByItemPath\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"] }]
47
66
  }], propDecorators: { baseUrl: [{
48
67
  type: Input
49
68
  }], cacheTs: [{
50
69
  type: Input
51
70
  }], apps: [{
52
71
  type: Input
72
+ }], language: [{
73
+ type: Input
53
74
  }] } });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaGVkd2ktYXBwLW1lbnUvc3JjL2xpYi9hcHAtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9oZWR3aS1hcHAtbWVudS9zcmMvbGliL2FwcC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBZ0IsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBUTdFLE1BQU0sT0FBTyxnQkFBZ0I7SUFON0I7UUFPRSx1Q0FBdUM7UUFDOUIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUN0Qix1QkFBdUI7UUFDZCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLHFCQUFxQjtRQUNaLFNBQUksR0FBbUIsMkJBQTJCLENBQUM7S0ErQjdEO0lBN0JDLGVBQWU7SUFDZixXQUFXLENBQUMsSUFBa0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsSUFBSSxTQUFTO1FBQ1gsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFrQjtRQUN4QixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxHQUFHLElBQUksdUJBQXVCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNELENBQUM7SUFFRCxRQUFRLENBQUMsSUFBa0I7UUFDekIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDeEUsQ0FBQzsrR0FwQ1UsZ0JBQWdCO21HQUFoQixnQkFBZ0Isd0hDVDdCLHllQWdCQTs7NEZEUGEsZ0JBQWdCO2tCQU41QixTQUFTOytCQUNFLGdCQUFnQixjQUNkLEtBQUs7OEJBTVIsT0FBTztzQkFBZixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIZWR3aUFwcEl0ZW0sIEhFRFdJX0FQUF9NRU5VX0RFRkFVTFRfQVBQUyB9IGZyb20gJy4vYXBwLW1lbnUudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZWR3aS1hcHAtbWVudScsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtbWVudS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFwcE1lbnVDb21wb25lbnQge1xuICAvKiog6Z2Z5oCB6LWE5rqQ5Z+656GAIFVSTO+8jOWmgiBlbnZpcm9ubWVudC5iYXNldXJsICovXG4gIEBJbnB1dCgpIGJhc2VVcmwgPSAnJztcbiAgLyoqIOe8k+WtmOaXtumXtOaIs++8jOeUqOS6jiBVUkwg6Ziy57yT5a2YICovXG4gIEBJbnB1dCgpIGNhY2hlVHMgPSAnJztcbiAgLyoqIOW6lOeUqOWIl+ihqO+8jOS4jeS8oOWImeS9v+eUqOm7mOiupOWIl+ihqCAqL1xuICBASW5wdXQoKSBhcHBzOiBIZWR3aUFwcEl0ZW1bXSA9IEhFRFdJX0FQUF9NRU5VX0RFRkFVTFRfQVBQUztcblxuICAvKiog6L+U5Zue5bqU55So5pi+56S65ZCN56ewICovXG4gIGRpc3BsYXlOYW1lKGl0ZW06IEhlZHdpQXBwSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZTtcbiAgfVxuXG4gIC8qKiDmjIkgZ3JvdXBJbmRleCDliIbnu4TvvIznlKjkuo7mjInooYzmuLLmn5MgKi9cbiAgZ2V0IGFwcEdyb3VwcygpOiBIZWR3aUFwcEl0ZW1bXVtdIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPG51bWJlciwgSGVkd2lBcHBJdGVtW10+KCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuYXBwcykge1xuICAgICAgY29uc3QgZyA9IGl0ZW0uZ3JvdXBJbmRleCA/PyAoaXRlbS5leHRyYSA/IDEgOiAwKTtcbiAgICAgIGlmICghbWFwLmhhcyhnKSkgbWFwLnNldChnLCBbXSk7XG4gICAgICBtYXAuZ2V0KGcpIS5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICBjb25zdCBtYXhHID0gTWF0aC5tYXgoMCwgLi4ubWFwLmtleXMoKSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG1heEcgKyAxIH0sIChfLCBpKSA9PiBtYXAuZ2V0KGkpID8/IFtdKTtcbiAgfVxuXG4gIGljb25VcmwoaXRlbTogSGVkd2lBcHBJdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gKHRoaXMuYmFzZVVybCB8fCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICBjb25zdCBwYXRoID0gYCR7YmFzZX0vbWFpbC9hc3NldHMvaW1hZ2VzLyR7aXRlbS5pY29ufWA7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVUcyA/IGAke3BhdGh9P3Y9JHt0aGlzLmNhY2hlVHN9YCA6IHBhdGg7XG4gIH1cblxuICBsaW5rSHJlZihpdGVtOiBIZWR3aUFwcEl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSAodGhpcy5iYXNlVXJsIHx8ICcnKS5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYmFzZSA/IGAke2Jhc2V9JHtpdGVtLnBhdGh9YCA6IGl0ZW0ucGF0aDtcbiAgICBjb25zdCBzZXAgPSBmdWxsUGF0aC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nO1xuICAgIHJldHVybiB0aGlzLmNhY2hlVHMgPyBgJHtmdWxsUGF0aH0ke3NlcH12PSR7dGhpcy5jYWNoZVRzfWAgOiBmdWxsUGF0aDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImhlZHdpLWFwcC1saXN0XCIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGFwcEdyb3Vwc1wiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJoZWR3aS1hcHAtaXRlbVwiXG4gICAgW2NsYXNzLmV4dHJhXT1cImdyb3VwWzBdPy5leHRyYVwiXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXBcIlxuICA+XG4gICAgPGEgW2F0dHIuaHJlZl09XCJsaW5rSHJlZihpdGVtKVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlZHdpLWFwcC1sb2dvXCI+XG4gICAgICAgIDxpbWcgW3NyY109XCJpY29uVXJsKGl0ZW0pXCIgW2FsdF09XCJkaXNwbGF5TmFtZShpdGVtKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWR3aS1hcHAtbmFtZVwiPlxuICAgICAgICA8c3Bhbj57eyBkaXNwbGF5TmFtZShpdGVtKSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaGVkd2ktYXBwLW1lbnUvc3JjL2xpYi9hcHAtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9oZWR3aS1hcHAtbWVudS9zcmMvbGliL2FwcC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQXNDLDJCQUEyQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQVFuRyxNQUFNLE9BQU8sZ0JBQWdCO0lBTjdCO1FBT0UsdUNBQXVDO1FBQzlCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDdEIsdUJBQXVCO1FBQ2QsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUN0QixxQkFBcUI7UUFDWixTQUFJLEdBQW1CLDJCQUEyQixDQUFDO1FBQzVELG9EQUFvRDtRQUMzQyxhQUFRLEdBQXlCLE9BQU8sQ0FBQztRQUVsRCxpRUFBaUU7UUFDakUsY0FBUyxHQUFxQixFQUFFLENBQUM7S0FrRGxDO0lBaERDLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsTUFBc0I7UUFDckQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELGVBQWUsQ0FBQyxLQUFhLEVBQUUsSUFBa0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxlQUFlO0lBQ2YsV0FBVyxDQUFDLElBQWtCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLENBQUMsSUFBa0I7UUFDeEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxJQUFJLHVCQUF1QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQWtCO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3hFLENBQUM7K0dBNURVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLG1LQ1Q3QiwraEJBZ0JBOzs0RkRQYSxnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsS0FBSzs4QkFNUixPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhlZHdpQXBwSXRlbSwgSGVkd2lBcHBNZW51TGFuZ3VhZ2UsIEhFRFdJX0FQUF9NRU5VX0RFRkFVTFRfQVBQUyB9IGZyb20gJy4vYXBwLW1lbnUudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZWR3aS1hcHAtbWVudScsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtbWVudS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFwcE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gIC8qKiDpnZnmgIHotYTmupDln7rnoYAgVVJM77yM5aaCIGVudmlyb25tZW50LmJhc2V1cmwgKi9cbiAgQElucHV0KCkgYmFzZVVybCA9ICcnO1xuICAvKiog57yT5a2Y5pe26Ze05oiz77yM55So5LqOIFVSTCDpmLLnvJPlrZggKi9cbiAgQElucHV0KCkgY2FjaGVUcyA9ICcnO1xuICAvKiog5bqU55So5YiX6KGo77yM5LiN5Lyg5YiZ5L2/55So6buY6K6k5YiX6KGoICovXG4gIEBJbnB1dCgpIGFwcHM6IEhlZHdpQXBwSXRlbVtdID0gSEVEV0lfQVBQX01FTlVfREVGQVVMVF9BUFBTO1xuICAvKiog55WM6Z2i6K+t6KiA77ya5LyY5YWIIG5hbWVzW2xhbmd1YWdlXe+8jOe8uuecgeaXtuWbnumAgCBuYW1l77yI6YCa5bi45Li6IGVuLXVz77yJICovXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBIZWR3aUFwcE1lbnVMYW5ndWFnZSA9ICdlbi11cyc7XG5cbiAgLyoqIOaMiSBncm91cEluZGV4IOWIhue7hOWQjueahOWIl+ihqO+8iOS7heW9kyBhcHBzIOWPmOWMluaXtumHjeaWsOiuoeeul++8jOmBv+WFjeavj+asoeWPmOabtOajgOa1i+i/lOWbnuaWsOaVsOe7hOWvvOiHtOWbvueJh+W+queOr+ivt+axgu+8iSAqL1xuICBhcHBHcm91cHM6IEhlZHdpQXBwSXRlbVtdW10gPSBbXTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcEdyb3VwcyA9IHRoaXMuYnVpbGRBcHBHcm91cHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snYXBwcyddKSB7XG4gICAgICB0aGlzLmFwcEdyb3VwcyA9IHRoaXMuYnVpbGRBcHBHcm91cHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQXBwR3JvdXBzKCk6IEhlZHdpQXBwSXRlbVtdW10ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBIZWR3aUFwcEl0ZW1bXT4oKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5hcHBzKSB7XG4gICAgICBjb25zdCBnID0gaXRlbS5ncm91cEluZGV4ID8/IChpdGVtLmV4dHJhID8gMSA6IDApO1xuICAgICAgaWYgKCFtYXAuaGFzKGcpKSBtYXAuc2V0KGcsIFtdKTtcbiAgICAgIG1hcC5nZXQoZykhLnB1c2goaXRlbSk7XG4gICAgfVxuICAgIGNvbnN0IG1heEcgPSBNYXRoLm1heCgwLCAuLi5tYXAua2V5cygpKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4RyArIDEgfSwgKF8sIGkpID0+IG1hcC5nZXQoaSkgPz8gW10pO1xuICB9XG5cbiAgLyoqIHRyYWNrQnnvvJrmjInliIbnu4TntKLlvJXvvIzpgb/lhY3ml6DmhI/kuYnnmoQgRE9NIOmHjeW7uiAqL1xuICB0cmFja0J5R3JvdXBJbmRleChpbmRleDogbnVtYmVyLCBfZ3JvdXA6IEhlZHdpQXBwSXRlbVtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKiogdHJhY2tCee+8muaMiSBwYXRoIOWUr+S4gOagh+ivhuW6lOeUqOmhue+8jOmBv+WFjeaXoOaEj+S5ieeahCBET00g6YeN5bu65LiO5Zu+54mH6YeN5aSN6K+35rGCICovXG4gIHRyYWNrQnlJdGVtUGF0aChpbmRleDogbnVtYmVyLCBpdGVtOiBIZWR3aUFwcEl0ZW0pOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVtLnBhdGg7XG4gIH1cblxuICAvKiog6L+U5Zue5bqU55So5pi+56S65ZCN56ewICovXG4gIGRpc3BsYXlOYW1lKGl0ZW06IEhlZHdpQXBwSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZXM/Llt0aGlzLmxhbmd1YWdlXSA/PyBpdGVtLm5hbWU7XG4gIH1cblxuICBpY29uVXJsKGl0ZW06IEhlZHdpQXBwSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9ICh0aGlzLmJhc2VVcmwgfHwgJycpLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgY29uc3QgcGF0aCA9IGAke2Jhc2V9L21haWwvYXNzZXRzL2ltYWdlcy8ke2l0ZW0uaWNvbn1gO1xuICAgIHJldHVybiB0aGlzLmNhY2hlVHMgPyBgJHtwYXRofT92PSR7dGhpcy5jYWNoZVRzfWAgOiBwYXRoO1xuICB9XG5cbiAgbGlua0hyZWYoaXRlbTogSGVkd2lBcHBJdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gKHRoaXMuYmFzZVVybCB8fCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJhc2UgPyBgJHtiYXNlfSR7aXRlbS5wYXRofWAgOiBpdGVtLnBhdGg7XG4gICAgY29uc3Qgc2VwID0gZnVsbFBhdGguaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcbiAgICByZXR1cm4gdGhpcy5jYWNoZVRzID8gYCR7ZnVsbFBhdGh9JHtzZXB9dj0ke3RoaXMuY2FjaGVUc31gIDogZnVsbFBhdGg7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoZWR3aS1hcHAtbGlzdFwiICpuZ0Zvcj1cImxldCBncm91cCBvZiBhcHBHcm91cHM7IHRyYWNrQnk6IHRyYWNrQnlHcm91cEluZGV4XCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImhlZHdpLWFwcC1pdGVtXCJcbiAgICBbY2xhc3MuZXh0cmFdPVwiZ3JvdXBbMF0/LmV4dHJhXCJcbiAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cDsgdHJhY2tCeTogdHJhY2tCeUl0ZW1QYXRoXCJcbiAgPlxuICAgIDxhIFthdHRyLmhyZWZdPVwibGlua0hyZWYoaXRlbSlcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWR3aS1hcHAtbG9nb1wiPlxuICAgICAgICA8aW1nIFtzcmNdPVwiaWNvblVybChpdGVtKVwiIFthbHRdPVwiZGlzcGxheU5hbWUoaXRlbSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVkd2ktYXBwLW5hbWVcIj5cbiAgICAgICAgPHNwYW4+e3sgZGlzcGxheU5hbWUoaXRlbSkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,18 +1,76 @@
1
+ /**
2
+ * 应用菜单支持的语言代码(BCP 47 风格小写),通过组件 `language` 输入选择
3
+ */
4
+ export const HEDWI_APP_MENU_LANGUAGES = [
5
+ 'am',
6
+ 'ar',
7
+ 'bn',
8
+ 'ceb',
9
+ 'de',
10
+ 'en-us',
11
+ 'es',
12
+ 'fa',
13
+ 'fil',
14
+ 'fr',
15
+ 'gu',
16
+ 'ha',
17
+ 'hi',
18
+ 'id',
19
+ 'ig',
20
+ 'it',
21
+ 'ja',
22
+ 'jv',
23
+ 'ki',
24
+ 'ko',
25
+ 'ln',
26
+ 'lu',
27
+ 'lua',
28
+ 'mg',
29
+ 'mr',
30
+ 'ne',
31
+ 'nl',
32
+ 'ny',
33
+ 'pa',
34
+ 'pcm',
35
+ 'pt',
36
+ 'ru',
37
+ 'sd',
38
+ 'si',
39
+ 'sn',
40
+ 'so',
41
+ 'st',
42
+ 'sw',
43
+ 'ta',
44
+ 'te',
45
+ 'th',
46
+ 'tr',
47
+ 'ur',
48
+ 'vi',
49
+ 'xh',
50
+ 'yo',
51
+ 'zh-hans',
52
+ 'zh-hant',
53
+ 'zu',
54
+ ];
55
+ /** 缩短默认列表中的多语言对象字面量 */
56
+ function appNames(zhHans, zhHant, ja) {
57
+ return { 'zh-hans': zhHans, 'zh-hant': zhHant, ja };
58
+ }
1
59
  /**
2
60
  * 默认应用列表,各项目可通过 apps 输入覆盖
3
61
  */
4
62
  export const HEDWI_APP_MENU_DEFAULT_APPS = [
5
- { path: '/mail', icon: 'mail.svg', name: 'Mail', i18nKey: 'Header|Mail', groupIndex: 0 },
6
- { path: '/contacts', icon: 'contacts.svg', name: 'Contacts', i18nKey: 'Header|Contacts', groupIndex: 0 },
7
- { path: '/calendar', icon: 'calendar.svg', name: 'Calendar', i18nKey: 'Header|Calendar', groupIndex: 0 },
8
- { path: '/ai', icon: 'ai.svg', name: 'AI', i18nKey: 'Header|AI', groupIndex: 0 },
9
- { path: '/chat', icon: 'chat.svg', name: 'Chat', i18nKey: 'Header|Chat', extra: true, groupIndex: 1 },
10
- { path: '/meet', icon: 'meet.svg', name: 'Meet', i18nKey: 'Header|Meet', extra: true, groupIndex: 1 },
11
- { path: '/kanban', icon: 'kanban.svg', name: 'Kanban', i18nKey: 'Header|Kanban', extra: true, groupIndex: 1 },
12
- { path: '/drive', icon: 'drive.svg', name: 'Drive', i18nKey: 'Header|Drive', extra: true, groupIndex: 1 },
13
- { path: '/docshome?type=doc', icon: 'docs.svg', name: 'Docs', i18nKey: 'Header|Docs', extra: true, groupIndex: 2 },
14
- { path: '/docshome?type=sheet', icon: 'sheets.svg', name: 'Sheets', i18nKey: 'Header|Sheets', extra: true, groupIndex: 2 },
15
- { path: '/docshome?type=slide', icon: 'slides.svg', name: 'Slides', i18nKey: 'Header|Slides', extra: true, groupIndex: 2 },
16
- { path: '/note', icon: 'note.svg', name: 'Note', i18nKey: 'Header|Note', extra: true, groupIndex: 2 },
63
+ { path: '/mail', icon: 'mail.svg', name: 'Mail', names: appNames('邮件', '郵件', 'メール'), i18nKey: 'Header|Mail', groupIndex: 0 },
64
+ { path: '/contacts', icon: 'contacts.svg', name: 'Contacts', names: appNames('通讯录', '聯絡人', '連絡先'), i18nKey: 'Header|Contacts', groupIndex: 0 },
65
+ { path: '/calendar', icon: 'calendar.svg', name: 'Calendar', names: appNames('日历', '行事曆', 'カレンダー'), i18nKey: 'Header|Calendar', groupIndex: 0 },
66
+ { path: '/ai', icon: 'ai.svg', name: 'AI', names: appNames('AI', 'AI', 'AI'), i18nKey: 'Header|AI', groupIndex: 0 },
67
+ { path: '/chat', icon: 'chat.svg', name: 'Chat', names: appNames('聊天', '聊天', 'チャット'), i18nKey: 'Header|Chat', extra: true, groupIndex: 1 },
68
+ { path: '/meet', icon: 'meet.svg', name: 'Meet', names: appNames('会议', '會議', 'Meet'), i18nKey: 'Header|Meet', extra: true, groupIndex: 1 },
69
+ { path: '/kanban', icon: 'kanban.svg', name: 'Kanban', names: appNames('看板', '看板', 'カンバン'), i18nKey: 'Header|Kanban', extra: true, groupIndex: 1 },
70
+ { path: '/drive', icon: 'drive.svg', name: 'Drive', names: appNames('云端硬盘', '雲端硬碟', 'ドライブ'), i18nKey: 'Header|Drive', extra: true, groupIndex: 1 },
71
+ { path: '/docshome?type=doc', icon: 'docs.svg', name: 'Docs', names: appNames('文档', '文件', 'ドキュメント'), i18nKey: 'Header|Docs', extra: true, groupIndex: 2 },
72
+ { path: '/docshome?type=sheet', icon: 'sheets.svg', name: 'Sheets', names: appNames('表格', '試算表', 'スプレッドシート'), i18nKey: 'Header|Sheets', extra: true, groupIndex: 2 },
73
+ { path: '/docshome?type=slide', icon: 'slides.svg', name: 'Slides', names: appNames('幻灯片', '簡報', 'スライド'), i18nKey: 'Header|Slides', extra: true, groupIndex: 2 },
74
+ { path: '/note', icon: 'note.svg', name: 'Note', names: appNames('笔记', '筆記', 'ノート'), i18nKey: 'Header|Note', extra: true, groupIndex: 2 },
17
75
  ];
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9oZWR3aS1hcHAtbWVudS9zcmMvbGliL2FwcC1tZW51LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFtQjtJQUN6RCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRTtJQUN4RixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO0lBQ3hHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUU7SUFDeEcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUU7SUFDaEYsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRTtJQUNyRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO0lBQ3JHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUU7SUFDN0csRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRTtJQUN6RyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUU7SUFDbEgsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO0lBQzFILEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRTtJQUMxSCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO0NBQ3RHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOWNleS4quW6lOeUqOmhuemFjee9ru+8jOeUqOS6juW6lOeUqOiPnOWNleW6k1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlZHdpQXBwSXRlbSB7XG4gIC8qKiDlupTnlKjot6/lvoTvvIzlpoIgL21haWwsIC9jaGF0ICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqIOWbvuagh+aWh+S7tuWQje+8jOWmgiBtYWlsLnN2Z++8jOebuOWvueS6jiBiYXNlVXJsL3N0YXRpYy9tYWlsL2Fzc2V0cy9pbWFnZXMvICovXG4gIGljb246IHN0cmluZztcbiAgLyoqIOaYvuekuuWQjeensCAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBpMThuIOmUru+8jOWmgiBcIkhlYWRlcnxNYWlsXCIgKi9cbiAgaTE4bktleT86IHN0cmluZztcbiAgLyoqIOaYr+WQpuW9kuexu+S4uuOAjOabtOWkmuOAjeW6lOeUqO+8iOagt+W8j+S4iuWPr+WMuuWIhu+8iSAqL1xuICBleHRyYT86IGJvb2xlYW47XG4gIC8qKiDliIbnu4TntKLlvJXvvJowPeS4u+W6lOeUqOihjO+8jDHjgIEyPeabtOWkmuW6lOeUqOihjO+8iOeUqOS6juWkmuihjOWxleekuu+8iSAqL1xuICBncm91cEluZGV4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIOm7mOiupOW6lOeUqOWIl+ihqO+8jOWQhOmhueebruWPr+mAmui/hyBhcHBzIOi+k+WFpeimhuebllxuICovXG5leHBvcnQgY29uc3QgSEVEV0lfQVBQX01FTlVfREVGQVVMVF9BUFBTOiBIZWR3aUFwcEl0ZW1bXSA9IFtcbiAgeyBwYXRoOiAnL21haWwnLCBpY29uOiAnbWFpbC5zdmcnLCBuYW1lOiAnTWFpbCcsIGkxOG5LZXk6ICdIZWFkZXJ8TWFpbCcsIGdyb3VwSW5kZXg6IDAgfSxcbiAgeyBwYXRoOiAnL2NvbnRhY3RzJywgaWNvbjogJ2NvbnRhY3RzLnN2ZycsIG5hbWU6ICdDb250YWN0cycsIGkxOG5LZXk6ICdIZWFkZXJ8Q29udGFjdHMnLCBncm91cEluZGV4OiAwIH0sXG4gIHsgcGF0aDogJy9jYWxlbmRhcicsIGljb246ICdjYWxlbmRhci5zdmcnLCBuYW1lOiAnQ2FsZW5kYXInLCBpMThuS2V5OiAnSGVhZGVyfENhbGVuZGFyJywgZ3JvdXBJbmRleDogMCB9LFxuICB7IHBhdGg6ICcvYWknLCBpY29uOiAnYWkuc3ZnJywgbmFtZTogJ0FJJywgaTE4bktleTogJ0hlYWRlcnxBSScsIGdyb3VwSW5kZXg6IDAgfSxcbiAgeyBwYXRoOiAnL2NoYXQnLCBpY29uOiAnY2hhdC5zdmcnLCBuYW1lOiAnQ2hhdCcsIGkxOG5LZXk6ICdIZWFkZXJ8Q2hhdCcsIGV4dHJhOiB0cnVlLCBncm91cEluZGV4OiAxIH0sXG4gIHsgcGF0aDogJy9tZWV0JywgaWNvbjogJ21lZXQuc3ZnJywgbmFtZTogJ01lZXQnLCBpMThuS2V5OiAnSGVhZGVyfE1lZXQnLCBleHRyYTogdHJ1ZSwgZ3JvdXBJbmRleDogMSB9LFxuICB7IHBhdGg6ICcva2FuYmFuJywgaWNvbjogJ2thbmJhbi5zdmcnLCBuYW1lOiAnS2FuYmFuJywgaTE4bktleTogJ0hlYWRlcnxLYW5iYW4nLCBleHRyYTogdHJ1ZSwgZ3JvdXBJbmRleDogMSB9LFxuICB7IHBhdGg6ICcvZHJpdmUnLCBpY29uOiAnZHJpdmUuc3ZnJywgbmFtZTogJ0RyaXZlJywgaTE4bktleTogJ0hlYWRlcnxEcml2ZScsIGV4dHJhOiB0cnVlLCBncm91cEluZGV4OiAxIH0sXG4gIHsgcGF0aDogJy9kb2NzaG9tZT90eXBlPWRvYycsIGljb246ICdkb2NzLnN2ZycsIG5hbWU6ICdEb2NzJywgaTE4bktleTogJ0hlYWRlcnxEb2NzJywgZXh0cmE6IHRydWUsIGdyb3VwSW5kZXg6IDIgfSxcbiAgeyBwYXRoOiAnL2RvY3Nob21lP3R5cGU9c2hlZXQnLCBpY29uOiAnc2hlZXRzLnN2ZycsIG5hbWU6ICdTaGVldHMnLCBpMThuS2V5OiAnSGVhZGVyfFNoZWV0cycsIGV4dHJhOiB0cnVlLCBncm91cEluZGV4OiAyIH0sXG4gIHsgcGF0aDogJy9kb2NzaG9tZT90eXBlPXNsaWRlJywgaWNvbjogJ3NsaWRlcy5zdmcnLCBuYW1lOiAnU2xpZGVzJywgaTE4bktleTogJ0hlYWRlcnxTbGlkZXMnLCBleHRyYTogdHJ1ZSwgZ3JvdXBJbmRleDogMiB9LFxuICB7IHBhdGg6ICcvbm90ZScsIGljb246ICdub3RlLnN2ZycsIG5hbWU6ICdOb3RlJywgaTE4bktleTogJ0hlYWRlcnxOb3RlJywgZXh0cmE6IHRydWUsIGdyb3VwSW5kZXg6IDIgfSxcbl07XG4iXX0=
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9oZWR3aS1hcHAtbWVudS9zcmMvbGliL2FwcC1tZW51LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7SUFDdEMsSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osS0FBSztJQUNMLElBQUk7SUFDSixPQUFPO0lBQ1AsSUFBSTtJQUNKLElBQUk7SUFDSixLQUFLO0lBQ0wsSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixLQUFLO0lBQ0wsSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLFNBQVM7SUFDVCxTQUFTO0lBQ1QsSUFBSTtDQUNJLENBQUM7QUF3QlgsdUJBQXVCO0FBQ3ZCLFNBQVMsUUFBUSxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBVTtJQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3RELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFtQjtJQUN6RCxFQUFFLElBQUks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RUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO0lBQ2hLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO0NBQzFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOW6lOeUqOiPnOWNleaUr+aMgeeahOivreiogOS7o+egge+8iEJDUCA0NyDpo47moLzlsI/lhpnvvInvvIzpgJrov4fnu4Tku7YgYGxhbmd1YWdlYCDovpPlhaXpgInmi6lcbiAqL1xuZXhwb3J0IGNvbnN0IEhFRFdJX0FQUF9NRU5VX0xBTkdVQUdFUyA9IFtcbiAgJ2FtJyxcbiAgJ2FyJyxcbiAgJ2JuJyxcbiAgJ2NlYicsXG4gICdkZScsXG4gICdlbi11cycsXG4gICdlcycsXG4gICdmYScsXG4gICdmaWwnLFxuICAnZnInLFxuICAnZ3UnLFxuICAnaGEnLFxuICAnaGknLFxuICAnaWQnLFxuICAnaWcnLFxuICAnaXQnLFxuICAnamEnLFxuICAnanYnLFxuICAna2knLFxuICAna28nLFxuICAnbG4nLFxuICAnbHUnLFxuICAnbHVhJyxcbiAgJ21nJyxcbiAgJ21yJyxcbiAgJ25lJyxcbiAgJ25sJyxcbiAgJ255JyxcbiAgJ3BhJyxcbiAgJ3BjbScsXG4gICdwdCcsXG4gICdydScsXG4gICdzZCcsXG4gICdzaScsXG4gICdzbicsXG4gICdzbycsXG4gICdzdCcsXG4gICdzdycsXG4gICd0YScsXG4gICd0ZScsXG4gICd0aCcsXG4gICd0cicsXG4gICd1cicsXG4gICd2aScsXG4gICd4aCcsXG4gICd5bycsXG4gICd6aC1oYW5zJyxcbiAgJ3poLWhhbnQnLFxuICAnenUnLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgSGVkd2lBcHBNZW51TGFuZ3VhZ2UgPSAodHlwZW9mIEhFRFdJX0FQUF9NRU5VX0xBTkdVQUdFUylbbnVtYmVyXTtcblxuLyoqXG4gKiDljZXkuKrlupTnlKjpobnphY3nva7vvIznlKjkuo7lupTnlKjoj5zljZXlupNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWR3aUFwcEl0ZW0ge1xuICAvKiog5bqU55So6Lev5b6E77yM5aaCIC9tYWlsLCAvY2hhdCAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiDlm77moIfmlofku7blkI3vvIzlpoIgbWFpbC5zdmfvvIznm7jlr7nkuo4gYmFzZVVybC9zdGF0aWMvbWFpbC9hc3NldHMvaW1hZ2VzLyAqL1xuICBpY29uOiBzdHJpbmc7XG4gIC8qKiDpu5jorqTmmL7npLrlkI3vvIjpgJrluLjkuLogZW4tdXMg5paH5qGI77yJ77yM5Lmf55So5L2c5pyq6YWN572u6K+t6KiA55qE5Zue6YCAICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIOWQhOivreiogOaYvuekuuWQje+8m+W9k+WJjeivreiogOaXoOadoeebruaXtuWbnumAgOWIsCBuYW1lICovXG4gIG5hbWVzPzogUGFydGlhbDxSZWNvcmQ8SGVkd2lBcHBNZW51TGFuZ3VhZ2UsIHN0cmluZz4+O1xuICAvKiogaTE4biDplK7vvIzlpoIgXCJIZWFkZXJ8TWFpbFwiICovXG4gIGkxOG5LZXk/OiBzdHJpbmc7XG4gIC8qKiDmmK/lkKblvZLnsbvkuLrjgIzmm7TlpJrjgI3lupTnlKjvvIjmoLflvI/kuIrlj6/ljLrliIbvvIkgKi9cbiAgZXh0cmE/OiBib29sZWFuO1xuICAvKiog5YiG57uE57Si5byV77yaMD3kuLvlupTnlKjooYzvvIwx44CBMj3mm7TlpJrlupTnlKjooYzvvIjnlKjkuo7lpJrooYzlsZXnpLrvvIkgKi9cbiAgZ3JvdXBJbmRleD86IG51bWJlcjtcbn1cblxuLyoqIOe8qeefrem7mOiupOWIl+ihqOS4reeahOWkmuivreiogOWvueixoeWtl+mdoumHjyAqL1xuZnVuY3Rpb24gYXBwTmFtZXMoemhIYW5zOiBzdHJpbmcsIHpoSGFudDogc3RyaW5nLCBqYTogc3RyaW5nKTogSGVkd2lBcHBJdGVtWyduYW1lcyddIHtcbiAgcmV0dXJuIHsgJ3poLWhhbnMnOiB6aEhhbnMsICd6aC1oYW50JzogemhIYW50LCBqYSB9O1xufVxuXG4vKipcbiAqIOm7mOiupOW6lOeUqOWIl+ihqO+8jOWQhOmhueebruWPr+mAmui/hyBhcHBzIOi+k+WFpeimhuebllxuICovXG5leHBvcnQgY29uc3QgSEVEV0lfQVBQX01FTlVfREVGQVVMVF9BUFBTOiBIZWR3aUFwcEl0ZW1bXSA9IFtcbiAgeyBwYXRoOiAnL21haWwnLCBpY29uOiAnbWFpbC5zdmcnLCBuYW1lOiAnTWFpbCcsIG5hbWVzOiBhcHBOYW1lcygn6YKu5Lu2JywgJ+mDteS7ticsICfjg6Hjg7zjg6snKSwgaTE4bktleTogJ0hlYWRlcnxNYWlsJywgZ3JvdXBJbmRleDogMCB9LFxuICB7IHBhdGg6ICcvY29udGFjdHMnLCBpY29uOiAnY29udGFjdHMuc3ZnJywgbmFtZTogJ0NvbnRhY3RzJywgbmFtZXM6IGFwcE5hbWVzKCfpgJrorq/lvZUnLCAn6IGv57Wh5Lq6JywgJ+mAo+e1oeWFiCcpLCBpMThuS2V5OiAnSGVhZGVyfENvbnRhY3RzJywgZ3JvdXBJbmRleDogMCB9LFxuICB7IHBhdGg6ICcvY2FsZW5kYXInLCBpY29uOiAnY2FsZW5kYXIuc3ZnJywgbmFtZTogJ0NhbGVuZGFyJywgbmFtZXM6IGFwcE5hbWVzKCfml6XljoYnLCAn6KGM5LqL5puGJywgJ+OCq+ODrOODs+ODgOODvCcpLCBpMThuS2V5OiAnSGVhZGVyfENhbGVuZGFyJywgZ3JvdXBJbmRleDogMCB9LFxuICB7IHBhdGg6ICcvYWknLCBpY29uOiAnYWkuc3ZnJywgbmFtZTogJ0FJJywgbmFtZXM6IGFwcE5hbWVzKCdBSScsICdBSScsICdBSScpLCBpMThuS2V5OiAnSGVhZGVyfEFJJywgZ3JvdXBJbmRleDogMCB9LFxuICB7IHBhdGg6ICcvY2hhdCcsIGljb246ICdjaGF0LnN2ZycsIG5hbWU6ICdDaGF0JywgbmFtZXM6IGFwcE5hbWVzKCfogYrlpKknLCAn6IGK5aSpJywgJ+ODgeODo+ODg+ODiCcpLCBpMThuS2V5OiAnSGVhZGVyfENoYXQnLCBleHRyYTogdHJ1ZSwgZ3JvdXBJbmRleDogMSB9LFxuICB7IHBhdGg6ICcvbWVldCcsIGljb246ICdtZWV0LnN2ZycsIG5hbWU6ICdNZWV0JywgbmFtZXM6IGFwcE5hbWVzKCfkvJrorq4nLCAn5pyD6K2wJywgJ01lZXQnKSwgaTE4bktleTogJ0hlYWRlcnxNZWV0JywgZXh0cmE6IHRydWUsIGdyb3VwSW5kZXg6IDEgfSxcbiAgeyBwYXRoOiAnL2thbmJhbicsIGljb246ICdrYW5iYW4uc3ZnJywgbmFtZTogJ0thbmJhbicsIG5hbWVzOiBhcHBOYW1lcygn55yL5p2/JywgJ+eci+advycsICfjgqvjg7Pjg5Djg7MnKSwgaTE4bktleTogJ0hlYWRlcnxLYW5iYW4nLCBleHRyYTogdHJ1ZSwgZ3JvdXBJbmRleDogMSB9LFxuICB7IHBhdGg6ICcvZHJpdmUnLCBpY29uOiAnZHJpdmUuc3ZnJywgbmFtZTogJ0RyaXZlJywgbmFtZXM6IGFwcE5hbWVzKCfkupHnq6/noaznm5gnLCAn6Zuy56uv56Gs56KfJywgJ+ODieODqeOCpOODlicpLCBpMThuS2V5OiAnSGVhZGVyfERyaXZlJywgZXh0cmE6IHRydWUsIGdyb3VwSW5kZXg6IDEgfSxcbiAgeyBwYXRoOiAnL2RvY3Nob21lP3R5cGU9ZG9jJywgaWNvbjogJ2RvY3Muc3ZnJywgbmFtZTogJ0RvY3MnLCBuYW1lczogYXBwTmFtZXMoJ+aWh+ahoycsICfmlofku7YnLCAn44OJ44Kt44Ol44Oh44Oz44OIJyksIGkxOG5LZXk6ICdIZWFkZXJ8RG9jcycsIGV4dHJhOiB0cnVlLCBncm91cEluZGV4OiAyIH0sXG4gIHsgcGF0aDogJy9kb2NzaG9tZT90eXBlPXNoZWV0JywgaWNvbjogJ3NoZWV0cy5zdmcnLCBuYW1lOiAnU2hlZXRzJywgbmFtZXM6IGFwcE5hbWVzKCfooajmoLwnLCAn6Kmm566X6KGoJywgJ+OCueODl+ODrOODg+ODieOCt+ODvOODiCcpLCBpMThuS2V5OiAnSGVhZGVyfFNoZWV0cycsIGV4dHJhOiB0cnVlLCBncm91cEluZGV4OiAyIH0sXG4gIHsgcGF0aDogJy9kb2NzaG9tZT90eXBlPXNsaWRlJywgaWNvbjogJ3NsaWRlcy5zdmcnLCBuYW1lOiAnU2xpZGVzJywgbmFtZXM6IGFwcE5hbWVzKCflubvnga/niYcnLCAn57Ch5aCxJywgJ+OCueODqeOCpOODiScpLCBpMThuS2V5OiAnSGVhZGVyfFNsaWRlcycsIGV4dHJhOiB0cnVlLCBncm91cEluZGV4OiAyIH0sXG4gIHsgcGF0aDogJy9ub3RlJywgaWNvbjogJ25vdGUuc3ZnJywgbmFtZTogJ05vdGUnLCBuYW1lczogYXBwTmFtZXMoJ+eslOiusCcsICfnrYboqJgnLCAn44OO44O844OIJyksIGkxOG5LZXk6ICdIZWFkZXJ8Tm90ZScsIGV4dHJhOiB0cnVlLCBncm91cEluZGV4OiAyIH0sXG5dO1xuIl19
@@ -1,7 +1,7 @@
1
1
  /*
2
- * Public API Surface of hedwi-app-menu
2
+ * Public API Surface of bind-app-menu
3
3
  */
4
4
  export { HedwiAppMenuModule } from './lib/app-menu.module';
5
5
  export { AppMenuComponent } from './lib/app-menu.component';
6
- export { HEDWI_APP_MENU_DEFAULT_APPS } from './lib/app-menu.types';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2hlZHdpLWFwcC1tZW51L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGhlZHdpLWFwcC1tZW51XG4gKi9cblxuZXhwb3J0IHsgSGVkd2lBcHBNZW51TW9kdWxlIH0gZnJvbSAnLi9saWIvYXBwLW1lbnUubW9kdWxlJztcbmV4cG9ydCB7IEFwcE1lbnVDb21wb25lbnQgfSBmcm9tICcuL2xpYi9hcHAtbWVudS5jb21wb25lbnQnO1xuZXhwb3J0IHR5cGUgeyBIZWR3aUFwcEl0ZW0gfSBmcm9tICcuL2xpYi9hcHAtbWVudS50eXBlcyc7XG5leHBvcnQgeyBIRURXSV9BUFBfTUVOVV9ERUZBVUxUX0FQUFMgfSBmcm9tICcuL2xpYi9hcHAtbWVudS50eXBlcyc7XG4iXX0=
6
+ export { HEDWI_APP_MENU_DEFAULT_APPS, HEDWI_APP_MENU_LANGUAGES } from './lib/app-menu.types';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2hlZHdpLWFwcC1tZW51L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGJpbmQtYXBwLW1lbnVcbiAqL1xuXG5leHBvcnQgeyBIZWR3aUFwcE1lbnVNb2R1bGUgfSBmcm9tICcuL2xpYi9hcHAtbWVudS5tb2R1bGUnO1xuZXhwb3J0IHsgQXBwTWVudUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2FwcC1tZW51LmNvbXBvbmVudCc7XG5leHBvcnQgdHlwZSB7IEhlZHdpQXBwSXRlbSwgSGVkd2lBcHBNZW51TGFuZ3VhZ2UgfSBmcm9tICcuL2xpYi9hcHAtbWVudS50eXBlcyc7XG5leHBvcnQgeyBIRURXSV9BUFBfTUVOVV9ERUZBVUxUX0FQUFMsIEhFRFdJX0FQUF9NRU5VX0xBTkdVQUdFUyB9IGZyb20gJy4vbGliL2FwcC1tZW51LnR5cGVzJztcbiJdfQ==
@@ -3,22 +3,80 @@ import { Component, Input, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
 
6
+ /**
7
+ * 应用菜单支持的语言代码(BCP 47 风格小写),通过组件 `language` 输入选择
8
+ */
9
+ const HEDWI_APP_MENU_LANGUAGES = [
10
+ 'am',
11
+ 'ar',
12
+ 'bn',
13
+ 'ceb',
14
+ 'de',
15
+ 'en-us',
16
+ 'es',
17
+ 'fa',
18
+ 'fil',
19
+ 'fr',
20
+ 'gu',
21
+ 'ha',
22
+ 'hi',
23
+ 'id',
24
+ 'ig',
25
+ 'it',
26
+ 'ja',
27
+ 'jv',
28
+ 'ki',
29
+ 'ko',
30
+ 'ln',
31
+ 'lu',
32
+ 'lua',
33
+ 'mg',
34
+ 'mr',
35
+ 'ne',
36
+ 'nl',
37
+ 'ny',
38
+ 'pa',
39
+ 'pcm',
40
+ 'pt',
41
+ 'ru',
42
+ 'sd',
43
+ 'si',
44
+ 'sn',
45
+ 'so',
46
+ 'st',
47
+ 'sw',
48
+ 'ta',
49
+ 'te',
50
+ 'th',
51
+ 'tr',
52
+ 'ur',
53
+ 'vi',
54
+ 'xh',
55
+ 'yo',
56
+ 'zh-hans',
57
+ 'zh-hant',
58
+ 'zu',
59
+ ];
60
+ /** 缩短默认列表中的多语言对象字面量 */
61
+ function appNames(zhHans, zhHant, ja) {
62
+ return { 'zh-hans': zhHans, 'zh-hant': zhHant, ja };
63
+ }
6
64
  /**
7
65
  * 默认应用列表,各项目可通过 apps 输入覆盖
8
66
  */
9
67
  const HEDWI_APP_MENU_DEFAULT_APPS = [
10
- { path: '/mail', icon: 'mail.svg', name: 'Mail', i18nKey: 'Header|Mail', groupIndex: 0 },
11
- { path: '/contacts', icon: 'contacts.svg', name: 'Contacts', i18nKey: 'Header|Contacts', groupIndex: 0 },
12
- { path: '/calendar', icon: 'calendar.svg', name: 'Calendar', i18nKey: 'Header|Calendar', groupIndex: 0 },
13
- { path: '/ai', icon: 'ai.svg', name: 'AI', i18nKey: 'Header|AI', groupIndex: 0 },
14
- { path: '/chat', icon: 'chat.svg', name: 'Chat', i18nKey: 'Header|Chat', extra: true, groupIndex: 1 },
15
- { path: '/meet', icon: 'meet.svg', name: 'Meet', i18nKey: 'Header|Meet', extra: true, groupIndex: 1 },
16
- { path: '/kanban', icon: 'kanban.svg', name: 'Kanban', i18nKey: 'Header|Kanban', extra: true, groupIndex: 1 },
17
- { path: '/drive', icon: 'drive.svg', name: 'Drive', i18nKey: 'Header|Drive', extra: true, groupIndex: 1 },
18
- { path: '/docshome?type=doc', icon: 'docs.svg', name: 'Docs', i18nKey: 'Header|Docs', extra: true, groupIndex: 2 },
19
- { path: '/docshome?type=sheet', icon: 'sheets.svg', name: 'Sheets', i18nKey: 'Header|Sheets', extra: true, groupIndex: 2 },
20
- { path: '/docshome?type=slide', icon: 'slides.svg', name: 'Slides', i18nKey: 'Header|Slides', extra: true, groupIndex: 2 },
21
- { path: '/note', icon: 'note.svg', name: 'Note', i18nKey: 'Header|Note', extra: true, groupIndex: 2 },
68
+ { path: '/mail', icon: 'mail.svg', name: 'Mail', names: appNames('邮件', '郵件', 'メール'), i18nKey: 'Header|Mail', groupIndex: 0 },
69
+ { path: '/contacts', icon: 'contacts.svg', name: 'Contacts', names: appNames('通讯录', '聯絡人', '連絡先'), i18nKey: 'Header|Contacts', groupIndex: 0 },
70
+ { path: '/calendar', icon: 'calendar.svg', name: 'Calendar', names: appNames('日历', '行事曆', 'カレンダー'), i18nKey: 'Header|Calendar', groupIndex: 0 },
71
+ { path: '/ai', icon: 'ai.svg', name: 'AI', names: appNames('AI', 'AI', 'AI'), i18nKey: 'Header|AI', groupIndex: 0 },
72
+ { path: '/chat', icon: 'chat.svg', name: 'Chat', names: appNames('聊天', '聊天', 'チャット'), i18nKey: 'Header|Chat', extra: true, groupIndex: 1 },
73
+ { path: '/meet', icon: 'meet.svg', name: 'Meet', names: appNames('会议', '會議', 'Meet'), i18nKey: 'Header|Meet', extra: true, groupIndex: 1 },
74
+ { path: '/kanban', icon: 'kanban.svg', name: 'Kanban', names: appNames('看板', '看板', 'カンバン'), i18nKey: 'Header|Kanban', extra: true, groupIndex: 1 },
75
+ { path: '/drive', icon: 'drive.svg', name: 'Drive', names: appNames('云端硬盘', '雲端硬碟', 'ドライブ'), i18nKey: 'Header|Drive', extra: true, groupIndex: 1 },
76
+ { path: '/docshome?type=doc', icon: 'docs.svg', name: 'Docs', names: appNames('文档', '文件', 'ドキュメント'), i18nKey: 'Header|Docs', extra: true, groupIndex: 2 },
77
+ { path: '/docshome?type=sheet', icon: 'sheets.svg', name: 'Sheets', names: appNames('表格', '試算表', 'スプレッドシート'), i18nKey: 'Header|Sheets', extra: true, groupIndex: 2 },
78
+ { path: '/docshome?type=slide', icon: 'slides.svg', name: 'Slides', names: appNames('幻灯片', '簡報', 'スライド'), i18nKey: 'Header|Slides', extra: true, groupIndex: 2 },
79
+ { path: '/note', icon: 'note.svg', name: 'Note', names: appNames('笔记', '筆記', 'ノート'), i18nKey: 'Header|Note', extra: true, groupIndex: 2 },
22
80
  ];
23
81
 
24
82
  class AppMenuComponent {
@@ -29,13 +87,20 @@ class AppMenuComponent {
29
87
  this.cacheTs = '';
30
88
  /** 应用列表,不传则使用默认列表 */
31
89
  this.apps = HEDWI_APP_MENU_DEFAULT_APPS;
90
+ /** 界面语言:优先 names[language],缺省时回退 name(通常为 en-us) */
91
+ this.language = 'en-us';
92
+ /** 按 groupIndex 分组后的列表(仅当 apps 变化时重新计算,避免每次变更检测返回新数组导致图片循环请求) */
93
+ this.appGroups = [];
32
94
  }
33
- /** 返回应用显示名称 */
34
- displayName(item) {
35
- return item.name;
95
+ ngOnInit() {
96
+ this.appGroups = this.buildAppGroups();
97
+ }
98
+ ngOnChanges(changes) {
99
+ if (changes['apps']) {
100
+ this.appGroups = this.buildAppGroups();
101
+ }
36
102
  }
37
- /** 按 groupIndex 分组,用于按行渲染 */
38
- get appGroups() {
103
+ buildAppGroups() {
39
104
  const map = new Map();
40
105
  for (const item of this.apps) {
41
106
  const g = item.groupIndex ?? (item.extra ? 1 : 0);
@@ -46,6 +111,18 @@ class AppMenuComponent {
46
111
  const maxG = Math.max(0, ...map.keys());
47
112
  return Array.from({ length: maxG + 1 }, (_, i) => map.get(i) ?? []);
48
113
  }
114
+ /** trackBy:按分组索引,避免无意义的 DOM 重建 */
115
+ trackByGroupIndex(index, _group) {
116
+ return index;
117
+ }
118
+ /** trackBy:按 path 唯一标识应用项,避免无意义的 DOM 重建与图片重复请求 */
119
+ trackByItemPath(index, item) {
120
+ return item.path;
121
+ }
122
+ /** 返回应用显示名称 */
123
+ displayName(item) {
124
+ return item.names?.[this.language] ?? item.name;
125
+ }
49
126
  iconUrl(item) {
50
127
  const base = (this.baseUrl || '').replace(/\/$/, '');
51
128
  const path = `${base}/mail/assets/images/${item.icon}`;
@@ -58,17 +135,19 @@ class AppMenuComponent {
58
135
  return this.cacheTs ? `${fullPath}${sep}v=${this.cacheTs}` : fullPath;
59
136
  }
60
137
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
61
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppMenuComponent, selector: "hedwi-app-menu", inputs: { baseUrl: "baseUrl", cacheTs: "cacheTs", apps: "apps" }, ngImport: i0, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
138
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppMenuComponent, selector: "hedwi-app-menu", inputs: { baseUrl: "baseUrl", cacheTs: "cacheTs", apps: "apps", language: "language" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups; trackBy: trackByGroupIndex\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group; trackBy: trackByItemPath\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
62
139
  }
63
140
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, decorators: [{
64
141
  type: Component,
65
- args: [{ selector: 'hedwi-app-menu', standalone: false, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"] }]
142
+ args: [{ selector: 'hedwi-app-menu', standalone: false, template: "<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups; trackBy: trackByGroupIndex\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group; trackBy: trackByItemPath\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n", styles: [".hedwi-app-list{display:flex;padding:10px 5px;width:100%;overflow:auto;flex-wrap:wrap;box-sizing:border-box}.hedwi-app-item{width:80px;display:flex;flex-direction:column;box-sizing:border-box;padding:5px 0}.hedwi-app-item a{text-decoration:none;color:inherit}.hedwi-app-item:hover{background-color:var(--panel-bg-color, #f5f5f5);cursor:pointer}.hedwi-app-item div{display:flex;align-items:center;justify-content:center}.hedwi-app-item .hedwi-app-logo img{width:60px;height:60px}.hedwi-app-item .hedwi-app-name span{font-size:14px}.hedwi-app-item.extra .hedwi-app-logo img{padding:6px;box-sizing:border-box}:host-context(.app-menu){display:block}\n"] }]
66
143
  }], propDecorators: { baseUrl: [{
67
144
  type: Input
68
145
  }], cacheTs: [{
69
146
  type: Input
70
147
  }], apps: [{
71
148
  type: Input
149
+ }], language: [{
150
+ type: Input
72
151
  }] } });
73
152
 
74
153
  class HedwiAppMenuModule {
@@ -86,12 +165,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
86
165
  }] });
87
166
 
88
167
  /*
89
- * Public API Surface of hedwi-app-menu
168
+ * Public API Surface of bind-app-menu
90
169
  */
91
170
 
92
171
  /**
93
172
  * Generated bundle index. Do not edit.
94
173
  */
95
174
 
96
- export { AppMenuComponent, HEDWI_APP_MENU_DEFAULT_APPS, HedwiAppMenuModule };
175
+ export { AppMenuComponent, HEDWI_APP_MENU_DEFAULT_APPS, HEDWI_APP_MENU_LANGUAGES, HedwiAppMenuModule };
97
176
  //# sourceMappingURL=hedwi-app-menu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hedwi-app-menu.mjs","sources":["../../../projects/hedwi-app-menu/src/lib/app-menu.types.ts","../../../projects/hedwi-app-menu/src/lib/app-menu.component.ts","../../../projects/hedwi-app-menu/src/lib/app-menu.component.html","../../../projects/hedwi-app-menu/src/lib/app-menu.module.ts","../../../projects/hedwi-app-menu/src/public-api.ts","../../../projects/hedwi-app-menu/src/hedwi-app-menu.ts"],"sourcesContent":["/**\n * 单个应用项配置,用于应用菜单库\n */\nexport interface HedwiAppItem {\n /** 应用路径,如 /mail, /chat */\n path: string;\n /** 图标文件名,如 mail.svg,相对于 baseUrl/static/mail/assets/images/ */\n icon: string;\n /** 显示名称 */\n name: string;\n /** i18n 键,如 \"Header|Mail\" */\n i18nKey?: string;\n /** 是否归类为「更多」应用(样式上可区分) */\n extra?: boolean;\n /** 分组索引:0=主应用行,1、2=更多应用行(用于多行展示) */\n groupIndex?: number;\n}\n\n/**\n * 默认应用列表,各项目可通过 apps 输入覆盖\n */\nexport const HEDWI_APP_MENU_DEFAULT_APPS: HedwiAppItem[] = [\n { path: '/mail', icon: 'mail.svg', name: 'Mail', i18nKey: 'Header|Mail', groupIndex: 0 },\n { path: '/contacts', icon: 'contacts.svg', name: 'Contacts', i18nKey: 'Header|Contacts', groupIndex: 0 },\n { path: '/calendar', icon: 'calendar.svg', name: 'Calendar', i18nKey: 'Header|Calendar', groupIndex: 0 },\n { path: '/ai', icon: 'ai.svg', name: 'AI', i18nKey: 'Header|AI', groupIndex: 0 },\n { path: '/chat', icon: 'chat.svg', name: 'Chat', i18nKey: 'Header|Chat', extra: true, groupIndex: 1 },\n { path: '/meet', icon: 'meet.svg', name: 'Meet', i18nKey: 'Header|Meet', extra: true, groupIndex: 1 },\n { path: '/kanban', icon: 'kanban.svg', name: 'Kanban', i18nKey: 'Header|Kanban', extra: true, groupIndex: 1 },\n { path: '/drive', icon: 'drive.svg', name: 'Drive', i18nKey: 'Header|Drive', extra: true, groupIndex: 1 },\n { path: '/docshome?type=doc', icon: 'docs.svg', name: 'Docs', i18nKey: 'Header|Docs', extra: true, groupIndex: 2 },\n { path: '/docshome?type=sheet', icon: 'sheets.svg', name: 'Sheets', i18nKey: 'Header|Sheets', extra: true, groupIndex: 2 },\n { path: '/docshome?type=slide', icon: 'slides.svg', name: 'Slides', i18nKey: 'Header|Slides', extra: true, groupIndex: 2 },\n { path: '/note', icon: 'note.svg', name: 'Note', i18nKey: 'Header|Note', extra: true, groupIndex: 2 },\n];\n","import { Component, Input } from '@angular/core';\nimport { HedwiAppItem, HEDWI_APP_MENU_DEFAULT_APPS } from './app-menu.types';\n\n@Component({\n selector: 'hedwi-app-menu',\n standalone: false,\n templateUrl: './app-menu.component.html',\n styleUrls: ['./app-menu.component.css'],\n})\nexport class AppMenuComponent {\n /** 静态资源基础 URL,如 environment.baseurl */\n @Input() baseUrl = '';\n /** 缓存时间戳,用于 URL 防缓存 */\n @Input() cacheTs = '';\n /** 应用列表,不传则使用默认列表 */\n @Input() apps: HedwiAppItem[] = HEDWI_APP_MENU_DEFAULT_APPS;\n\n /** 返回应用显示名称 */\n displayName(item: HedwiAppItem): string {\n return item.name;\n }\n\n /** 按 groupIndex 分组,用于按行渲染 */\n get appGroups(): HedwiAppItem[][] {\n const map = new Map<number, HedwiAppItem[]>();\n for (const item of this.apps) {\n const g = item.groupIndex ?? (item.extra ? 1 : 0);\n if (!map.has(g)) map.set(g, []);\n map.get(g)!.push(item);\n }\n const maxG = Math.max(0, ...map.keys());\n return Array.from({ length: maxG + 1 }, (_, i) => map.get(i) ?? []);\n }\n\n iconUrl(item: HedwiAppItem): string {\n const base = (this.baseUrl || '').replace(/\\/$/, '');\n const path = `${base}/mail/assets/images/${item.icon}`;\n return this.cacheTs ? `${path}?v=${this.cacheTs}` : path;\n }\n\n linkHref(item: HedwiAppItem): string {\n const base = (this.baseUrl || '').replace(/\\/$/, '');\n const fullPath = base ? `${base}${item.path}` : item.path;\n const sep = fullPath.includes('?') ? '&' : '?';\n return this.cacheTs ? `${fullPath}${sep}v=${this.cacheTs}` : fullPath;\n }\n}\n","<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AppMenuComponent } from './app-menu.component';\n\n@NgModule({\n imports: [CommonModule],\n declarations: [AppMenuComponent],\n exports: [AppMenuComponent],\n})\nexport class HedwiAppMenuModule {}\n","/*\n * Public API Surface of hedwi-app-menu\n */\n\nexport { HedwiAppMenuModule } from './lib/app-menu.module';\nexport { AppMenuComponent } from './lib/app-menu.component';\nexport type { HedwiAppItem } from './lib/app-menu.types';\nexport { HEDWI_APP_MENU_DEFAULT_APPS } from './lib/app-menu.types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hedwi-app-menu.mjs","sources":["../../../projects/hedwi-app-menu/src/lib/app-menu.types.ts","../../../projects/hedwi-app-menu/src/lib/app-menu.component.ts","../../../projects/hedwi-app-menu/src/lib/app-menu.component.html","../../../projects/hedwi-app-menu/src/lib/app-menu.module.ts","../../../projects/hedwi-app-menu/src/public-api.ts","../../../projects/hedwi-app-menu/src/hedwi-app-menu.ts"],"sourcesContent":["/**\n * 应用菜单支持的语言代码(BCP 47 风格小写),通过组件 `language` 输入选择\n */\nexport const HEDWI_APP_MENU_LANGUAGES = [\n 'am',\n 'ar',\n 'bn',\n 'ceb',\n 'de',\n 'en-us',\n 'es',\n 'fa',\n 'fil',\n 'fr',\n 'gu',\n 'ha',\n 'hi',\n 'id',\n 'ig',\n 'it',\n 'ja',\n 'jv',\n 'ki',\n 'ko',\n 'ln',\n 'lu',\n 'lua',\n 'mg',\n 'mr',\n 'ne',\n 'nl',\n 'ny',\n 'pa',\n 'pcm',\n 'pt',\n 'ru',\n 'sd',\n 'si',\n 'sn',\n 'so',\n 'st',\n 'sw',\n 'ta',\n 'te',\n 'th',\n 'tr',\n 'ur',\n 'vi',\n 'xh',\n 'yo',\n 'zh-hans',\n 'zh-hant',\n 'zu',\n] as const;\n\nexport type HedwiAppMenuLanguage = (typeof HEDWI_APP_MENU_LANGUAGES)[number];\n\n/**\n * 单个应用项配置,用于应用菜单库\n */\nexport interface HedwiAppItem {\n /** 应用路径,如 /mail, /chat */\n path: string;\n /** 图标文件名,如 mail.svg,相对于 baseUrl/static/mail/assets/images/ */\n icon: string;\n /** 默认显示名(通常为 en-us 文案),也用作未配置语言的回退 */\n name: string;\n /** 各语言显示名;当前语言无条目时回退到 name */\n names?: Partial<Record<HedwiAppMenuLanguage, string>>;\n /** i18n 键,如 \"Header|Mail\" */\n i18nKey?: string;\n /** 是否归类为「更多」应用(样式上可区分) */\n extra?: boolean;\n /** 分组索引:0=主应用行,1、2=更多应用行(用于多行展示) */\n groupIndex?: number;\n}\n\n/** 缩短默认列表中的多语言对象字面量 */\nfunction appNames(zhHans: string, zhHant: string, ja: string): HedwiAppItem['names'] {\n return { 'zh-hans': zhHans, 'zh-hant': zhHant, ja };\n}\n\n/**\n * 默认应用列表,各项目可通过 apps 输入覆盖\n */\nexport const HEDWI_APP_MENU_DEFAULT_APPS: HedwiAppItem[] = [\n { path: '/mail', icon: 'mail.svg', name: 'Mail', names: appNames('邮件', '郵件', 'メール'), i18nKey: 'Header|Mail', groupIndex: 0 },\n { path: '/contacts', icon: 'contacts.svg', name: 'Contacts', names: appNames('通讯录', '聯絡人', '連絡先'), i18nKey: 'Header|Contacts', groupIndex: 0 },\n { path: '/calendar', icon: 'calendar.svg', name: 'Calendar', names: appNames('日历', '行事曆', 'カレンダー'), i18nKey: 'Header|Calendar', groupIndex: 0 },\n { path: '/ai', icon: 'ai.svg', name: 'AI', names: appNames('AI', 'AI', 'AI'), i18nKey: 'Header|AI', groupIndex: 0 },\n { path: '/chat', icon: 'chat.svg', name: 'Chat', names: appNames('聊天', '聊天', 'チャット'), i18nKey: 'Header|Chat', extra: true, groupIndex: 1 },\n { path: '/meet', icon: 'meet.svg', name: 'Meet', names: appNames('会议', '會議', 'Meet'), i18nKey: 'Header|Meet', extra: true, groupIndex: 1 },\n { path: '/kanban', icon: 'kanban.svg', name: 'Kanban', names: appNames('看板', '看板', 'カンバン'), i18nKey: 'Header|Kanban', extra: true, groupIndex: 1 },\n { path: '/drive', icon: 'drive.svg', name: 'Drive', names: appNames('云端硬盘', '雲端硬碟', 'ドライブ'), i18nKey: 'Header|Drive', extra: true, groupIndex: 1 },\n { path: '/docshome?type=doc', icon: 'docs.svg', name: 'Docs', names: appNames('文档', '文件', 'ドキュメント'), i18nKey: 'Header|Docs', extra: true, groupIndex: 2 },\n { path: '/docshome?type=sheet', icon: 'sheets.svg', name: 'Sheets', names: appNames('表格', '試算表', 'スプレッドシート'), i18nKey: 'Header|Sheets', extra: true, groupIndex: 2 },\n { path: '/docshome?type=slide', icon: 'slides.svg', name: 'Slides', names: appNames('幻灯片', '簡報', 'スライド'), i18nKey: 'Header|Slides', extra: true, groupIndex: 2 },\n { path: '/note', icon: 'note.svg', name: 'Note', names: appNames('笔记', '筆記', 'ノート'), i18nKey: 'Header|Note', extra: true, groupIndex: 2 },\n];\n","import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { HedwiAppItem, HedwiAppMenuLanguage, HEDWI_APP_MENU_DEFAULT_APPS } from './app-menu.types';\n\n@Component({\n selector: 'hedwi-app-menu',\n standalone: false,\n templateUrl: './app-menu.component.html',\n styleUrls: ['./app-menu.component.css'],\n})\nexport class AppMenuComponent implements OnChanges, OnInit {\n /** 静态资源基础 URL,如 environment.baseurl */\n @Input() baseUrl = '';\n /** 缓存时间戳,用于 URL 防缓存 */\n @Input() cacheTs = '';\n /** 应用列表,不传则使用默认列表 */\n @Input() apps: HedwiAppItem[] = HEDWI_APP_MENU_DEFAULT_APPS;\n /** 界面语言:优先 names[language],缺省时回退 name(通常为 en-us) */\n @Input() language: HedwiAppMenuLanguage = 'en-us';\n\n /** 按 groupIndex 分组后的列表(仅当 apps 变化时重新计算,避免每次变更检测返回新数组导致图片循环请求) */\n appGroups: HedwiAppItem[][] = [];\n\n ngOnInit(): void {\n this.appGroups = this.buildAppGroups();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['apps']) {\n this.appGroups = this.buildAppGroups();\n }\n }\n\n private buildAppGroups(): HedwiAppItem[][] {\n const map = new Map<number, HedwiAppItem[]>();\n for (const item of this.apps) {\n const g = item.groupIndex ?? (item.extra ? 1 : 0);\n if (!map.has(g)) map.set(g, []);\n map.get(g)!.push(item);\n }\n const maxG = Math.max(0, ...map.keys());\n return Array.from({ length: maxG + 1 }, (_, i) => map.get(i) ?? []);\n }\n\n /** trackBy:按分组索引,避免无意义的 DOM 重建 */\n trackByGroupIndex(index: number, _group: HedwiAppItem[]): number {\n return index;\n }\n\n /** trackBy:按 path 唯一标识应用项,避免无意义的 DOM 重建与图片重复请求 */\n trackByItemPath(index: number, item: HedwiAppItem): string {\n return item.path;\n }\n\n /** 返回应用显示名称 */\n displayName(item: HedwiAppItem): string {\n return item.names?.[this.language] ?? item.name;\n }\n\n iconUrl(item: HedwiAppItem): string {\n const base = (this.baseUrl || '').replace(/\\/$/, '');\n const path = `${base}/mail/assets/images/${item.icon}`;\n return this.cacheTs ? `${path}?v=${this.cacheTs}` : path;\n }\n\n linkHref(item: HedwiAppItem): string {\n const base = (this.baseUrl || '').replace(/\\/$/, '');\n const fullPath = base ? `${base}${item.path}` : item.path;\n const sep = fullPath.includes('?') ? '&' : '?';\n return this.cacheTs ? `${fullPath}${sep}v=${this.cacheTs}` : fullPath;\n }\n}\n","<div class=\"hedwi-app-list\" *ngFor=\"let group of appGroups; trackBy: trackByGroupIndex\">\n <div\n class=\"hedwi-app-item\"\n [class.extra]=\"group[0]?.extra\"\n *ngFor=\"let item of group; trackBy: trackByItemPath\"\n >\n <a [attr.href]=\"linkHref(item)\" target=\"_blank\">\n <div class=\"hedwi-app-logo\">\n <img [src]=\"iconUrl(item)\" [alt]=\"displayName(item)\" />\n </div>\n <div class=\"hedwi-app-name\">\n <span>{{ displayName(item) }}</span>\n </div>\n </a>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AppMenuComponent } from './app-menu.component';\n\n@NgModule({\n imports: [CommonModule],\n declarations: [AppMenuComponent],\n exports: [AppMenuComponent],\n})\nexport class HedwiAppMenuModule {}\n","/*\n * Public API Surface of bind-app-menu\n */\n\nexport { HedwiAppMenuModule } from './lib/app-menu.module';\nexport { AppMenuComponent } from './lib/app-menu.component';\nexport type { HedwiAppItem, HedwiAppMenuLanguage } from './lib/app-menu.types';\nexport { HEDWI_APP_MENU_DEFAULT_APPS, HEDWI_APP_MENU_LANGUAGES } from './lib/app-menu.types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,18 +1,28 @@
1
- import { HedwiAppItem } from './app-menu.types';
1
+ import { OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
+ import { HedwiAppItem, HedwiAppMenuLanguage } from './app-menu.types';
2
3
  import * as i0 from "@angular/core";
3
- export declare class AppMenuComponent {
4
+ export declare class AppMenuComponent implements OnChanges, OnInit {
4
5
  /** 静态资源基础 URL,如 environment.baseurl */
5
6
  baseUrl: string;
6
7
  /** 缓存时间戳,用于 URL 防缓存 */
7
8
  cacheTs: string;
8
9
  /** 应用列表,不传则使用默认列表 */
9
10
  apps: HedwiAppItem[];
11
+ /** 界面语言:优先 names[language],缺省时回退 name(通常为 en-us) */
12
+ language: HedwiAppMenuLanguage;
13
+ /** 按 groupIndex 分组后的列表(仅当 apps 变化时重新计算,避免每次变更检测返回新数组导致图片循环请求) */
14
+ appGroups: HedwiAppItem[][];
15
+ ngOnInit(): void;
16
+ ngOnChanges(changes: SimpleChanges): void;
17
+ private buildAppGroups;
18
+ /** trackBy:按分组索引,避免无意义的 DOM 重建 */
19
+ trackByGroupIndex(index: number, _group: HedwiAppItem[]): number;
20
+ /** trackBy:按 path 唯一标识应用项,避免无意义的 DOM 重建与图片重复请求 */
21
+ trackByItemPath(index: number, item: HedwiAppItem): string;
10
22
  /** 返回应用显示名称 */
11
23
  displayName(item: HedwiAppItem): string;
12
- /** 按 groupIndex 分组,用于按行渲染 */
13
- get appGroups(): HedwiAppItem[][];
14
24
  iconUrl(item: HedwiAppItem): string;
15
25
  linkHref(item: HedwiAppItem): string;
16
26
  static ɵfac: i0.ɵɵFactoryDeclaration<AppMenuComponent, never>;
17
- static ɵcmp: i0.ɵɵComponentDeclaration<AppMenuComponent, "hedwi-app-menu", never, { "baseUrl": { "alias": "baseUrl"; "required": false; }; "cacheTs": { "alias": "cacheTs"; "required": false; }; "apps": { "alias": "apps"; "required": false; }; }, {}, never, never, false, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppMenuComponent, "hedwi-app-menu", never, { "baseUrl": { "alias": "baseUrl"; "required": false; }; "cacheTs": { "alias": "cacheTs"; "required": false; }; "apps": { "alias": "apps"; "required": false; }; "language": { "alias": "language"; "required": false; }; }, {}, never, never, false, never>;
18
28
  }
@@ -1,3 +1,8 @@
1
+ /**
2
+ * 应用菜单支持的语言代码(BCP 47 风格小写),通过组件 `language` 输入选择
3
+ */
4
+ export declare const HEDWI_APP_MENU_LANGUAGES: readonly ["am", "ar", "bn", "ceb", "de", "en-us", "es", "fa", "fil", "fr", "gu", "ha", "hi", "id", "ig", "it", "ja", "jv", "ki", "ko", "ln", "lu", "lua", "mg", "mr", "ne", "nl", "ny", "pa", "pcm", "pt", "ru", "sd", "si", "sn", "so", "st", "sw", "ta", "te", "th", "tr", "ur", "vi", "xh", "yo", "zh-hans", "zh-hant", "zu"];
5
+ export type HedwiAppMenuLanguage = (typeof HEDWI_APP_MENU_LANGUAGES)[number];
1
6
  /**
2
7
  * 单个应用项配置,用于应用菜单库
3
8
  */
@@ -6,8 +11,10 @@ export interface HedwiAppItem {
6
11
  path: string;
7
12
  /** 图标文件名,如 mail.svg,相对于 baseUrl/static/mail/assets/images/ */
8
13
  icon: string;
9
- /** 显示名称 */
14
+ /** 默认显示名(通常为 en-us 文案),也用作未配置语言的回退 */
10
15
  name: string;
16
+ /** 各语言显示名;当前语言无条目时回退到 name */
17
+ names?: Partial<Record<HedwiAppMenuLanguage, string>>;
11
18
  /** i18n 键,如 "Header|Mail" */
12
19
  i18nKey?: string;
13
20
  /** 是否归类为「更多」应用(样式上可区分) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hedwi-app-menu",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^16.2.0",
6
6
  "@angular/core": "^16.2.0"
package/public-api.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { HedwiAppMenuModule } from './lib/app-menu.module';
2
2
  export { AppMenuComponent } from './lib/app-menu.component';
3
- export type { HedwiAppItem } from './lib/app-menu.types';
4
- export { HEDWI_APP_MENU_DEFAULT_APPS } from './lib/app-menu.types';
3
+ export type { HedwiAppItem, HedwiAppMenuLanguage } from './lib/app-menu.types';
4
+ export { HEDWI_APP_MENU_DEFAULT_APPS, HEDWI_APP_MENU_LANGUAGES } from './lib/app-menu.types';