hedwi-app-menu 0.0.1

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 ADDED
@@ -0,0 +1,48 @@
1
+ # hedwi-app-menu
2
+
3
+ 应用菜单组件库,用于在多个项目中复用「更多应用」下拉菜单(Mail、Contacts、Calendar、Chat、Drive 等)。
4
+
5
+ ## 在本项目中使用
6
+
7
+ 在 `app.module.ts` 中:
8
+
9
+ ```ts
10
+ import { HedwiAppMenuModule } from "../../projects/hedwi-app-menu/src/public-api";
11
+
12
+ @NgModule({
13
+ imports: [ ..., HedwiAppMenuModule ],
14
+ ...
15
+ })
16
+ ```
17
+
18
+ 在模板中(例如放在 `mat-menu` 内):
19
+
20
+ ```html
21
+ <mat-menu #appMenu="matMenu" class="app-menu">
22
+ <hedwi-app-menu
23
+ [baseUrl]="environment.baseurl"
24
+ [cacheTs]="cacheTs"
25
+ ></hedwi-app-menu>
26
+ </mat-menu>
27
+ ```
28
+
29
+ ## 在其它项目中使用
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'`。
33
+
34
+ ## i18n 支持
35
+
36
+ - 默认应用名称通过 `@angular/localize` 的 `$localize` 提供,与主项目一致。
37
+ - 主项目执行 **提取文案**(如 `ng extract-i18n`)时,会包含库内这些条目,生成/更新 `messages.*.xlf` 后按语言构建即可。
38
+ - 自定义 `apps` 时:若每项带 `i18nKey`(如 `Header|Mail`)且与库内默认键一致,会使用库内翻译;否则显示该项的 `name`(可由主项目在传入前自行翻译)。
39
+
40
+ 库的 peer 依赖包含 `@angular/localize`,主项目需已安装。
41
+
42
+ ## API
43
+
44
+ - **baseUrl** (`string`):静态资源基础 URL,如 `environment.baseurl`。
45
+ - **cacheTs** (`string`):缓存时间戳,用于 URL 防缓存。
46
+ - **apps** (`HedwiAppItem[]`,可选):应用列表;不传则使用内置默认列表。每项包含 `path`、`icon`、`name`、`i18nKey`、`extra`、`groupIndex`。
47
+
48
+ 导出类型与常量:`HedwiAppItem`、`HEDWI_APP_MENU_DEFAULT_APPS`。
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVkd2ktYXBwLW1lbnUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9oZWR3aS1hcHAtbWVudS9zcmMvaGVkd2ktYXBwLW1lbnUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,56 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { HEDWI_APP_MENU_DEFAULT_APPS } from './app-menu.types';
3
+ import { HEDWI_APP_MENU_I18N_NAMES } from './app-menu.i18n';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ export class AppMenuComponent {
7
+ constructor() {
8
+ /** 静态资源基础 URL,如 environment.baseurl */
9
+ this.baseUrl = '';
10
+ /** 缓存时间戳,用于 URL 防缓存 */
11
+ this.cacheTs = '';
12
+ /** 应用列表,不传则使用默认列表 */
13
+ this.apps = HEDWI_APP_MENU_DEFAULT_APPS;
14
+ }
15
+ /** 返回当前语言下的应用名称(支持 i18n) */
16
+ displayName(item) {
17
+ if (item.i18nKey && HEDWI_APP_MENU_I18N_NAMES[item.i18nKey] !== undefined) {
18
+ return HEDWI_APP_MENU_I18N_NAMES[item.i18nKey];
19
+ }
20
+ return item.name;
21
+ }
22
+ /** 按 groupIndex 分组,用于按行渲染 */
23
+ get appGroups() {
24
+ const map = new Map();
25
+ for (const item of this.apps) {
26
+ const g = item.groupIndex ?? (item.extra ? 1 : 0);
27
+ if (!map.has(g))
28
+ map.set(g, []);
29
+ map.get(g).push(item);
30
+ }
31
+ const maxG = Math.max(0, ...map.keys());
32
+ return Array.from({ length: maxG + 1 }, (_, i) => map.get(i) ?? []);
33
+ }
34
+ iconUrl(item) {
35
+ const base = (this.baseUrl || '').replace(/\/$/, '');
36
+ const path = `${base}/static/mail/assets/images/${item.icon}`;
37
+ return this.cacheTs ? `${path}?v=${this.cacheTs}` : path;
38
+ }
39
+ linkHref(item) {
40
+ const sep = item.path.includes('?') ? '&' : '?';
41
+ return this.cacheTs ? `${item.path}${sep}v=${this.cacheTs}` : item.path;
42
+ }
43
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
44
+ 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: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"] }] }); }
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, decorators: [{
47
+ type: Component,
48
+ 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: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"] }]
49
+ }], propDecorators: { baseUrl: [{
50
+ type: Input
51
+ }], cacheTs: [{
52
+ type: Input
53
+ }], apps: [{
54
+ type: Input
55
+ }] } });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaGVkd2ktYXBwLW1lbnUvc3JjL2xpYi9hcHAtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9oZWR3aS1hcHAtbWVudS9zcmMvbGliL2FwcC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBZ0IsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBUTVELE1BQU0sT0FBTyxnQkFBZ0I7SUFON0I7UUFPRSx1Q0FBdUM7UUFDOUIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUN0Qix1QkFBdUI7UUFDZCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLHFCQUFxQjtRQUNaLFNBQUksR0FBbUIsMkJBQTJCLENBQUM7S0FnQzdEO0lBOUJDLDRCQUE0QjtJQUM1QixXQUFXLENBQUMsSUFBa0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDekUsT0FBTyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELDZCQUE2QjtJQUM3QixJQUFJLFNBQVM7UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztRQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQWtCO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEdBQUcsSUFBSSw4QkFBOEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0QsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFrQjtRQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDaEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMxRSxDQUFDOytHQXJDVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQix3SENYN0IseWVBZ0JBOzs0RkRMYSxnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsS0FBSzs4QkFNUixPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIZWR3aUFwcEl0ZW0sIEhFRFdJX0FQUF9NRU5VX0RFRkFVTFRfQVBQUyB9IGZyb20gJy4vYXBwLW1lbnUudHlwZXMnO1xuaW1wb3J0IHsgSEVEV0lfQVBQX01FTlVfSTE4Tl9OQU1FUyB9IGZyb20gJy4vYXBwLW1lbnUuaTE4bic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlZHdpLWFwcC1tZW51JyxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC1tZW51LmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwTWVudUNvbXBvbmVudCB7XG4gIC8qKiDpnZnmgIHotYTmupDln7rnoYAgVVJM77yM5aaCIGVudmlyb25tZW50LmJhc2V1cmwgKi9cbiAgQElucHV0KCkgYmFzZVVybCA9ICcnO1xuICAvKiog57yT5a2Y5pe26Ze05oiz77yM55So5LqOIFVSTCDpmLLnvJPlrZggKi9cbiAgQElucHV0KCkgY2FjaGVUcyA9ICcnO1xuICAvKiog5bqU55So5YiX6KGo77yM5LiN5Lyg5YiZ5L2/55So6buY6K6k5YiX6KGoICovXG4gIEBJbnB1dCgpIGFwcHM6IEhlZHdpQXBwSXRlbVtdID0gSEVEV0lfQVBQX01FTlVfREVGQVVMVF9BUFBTO1xuXG4gIC8qKiDov5Tlm57lvZPliY3or63oqIDkuIvnmoTlupTnlKjlkI3np7DvvIjmlK/mjIEgaTE4bu+8iSAqL1xuICBkaXNwbGF5TmFtZShpdGVtOiBIZWR3aUFwcEl0ZW0pOiBzdHJpbmcge1xuICAgIGlmIChpdGVtLmkxOG5LZXkgJiYgSEVEV0lfQVBQX01FTlVfSTE4Tl9OQU1FU1tpdGVtLmkxOG5LZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBIRURXSV9BUFBfTUVOVV9JMThOX05BTUVTW2l0ZW0uaTE4bktleV07XG4gICAgfVxuICAgIHJldHVybiBpdGVtLm5hbWU7XG4gIH1cblxuICAvKiog5oyJIGdyb3VwSW5kZXgg5YiG57uE77yM55So5LqO5oyJ6KGM5riy5p+TICovXG4gIGdldCBhcHBHcm91cHMoKTogSGVkd2lBcHBJdGVtW11bXSB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxudW1iZXIsIEhlZHdpQXBwSXRlbVtdPigpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmFwcHMpIHtcbiAgICAgIGNvbnN0IGcgPSBpdGVtLmdyb3VwSW5kZXggPz8gKGl0ZW0uZXh0cmEgPyAxIDogMCk7XG4gICAgICBpZiAoIW1hcC5oYXMoZykpIG1hcC5zZXQoZywgW10pO1xuICAgICAgbWFwLmdldChnKSEucHVzaChpdGVtKTtcbiAgICB9XG4gICAgY29uc3QgbWF4RyA9IE1hdGgubWF4KDAsIC4uLm1hcC5rZXlzKCkpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXhHICsgMSB9LCAoXywgaSkgPT4gbWFwLmdldChpKSA/PyBbXSk7XG4gIH1cblxuICBpY29uVXJsKGl0ZW06IEhlZHdpQXBwSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9ICh0aGlzLmJhc2VVcmwgfHwgJycpLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgY29uc3QgcGF0aCA9IGAke2Jhc2V9L3N0YXRpYy9tYWlsL2Fzc2V0cy9pbWFnZXMvJHtpdGVtLmljb259YDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVRzID8gYCR7cGF0aH0/dj0ke3RoaXMuY2FjaGVUc31gIDogcGF0aDtcbiAgfVxuXG4gIGxpbmtIcmVmKGl0ZW06IEhlZHdpQXBwSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VwID0gaXRlbS5wYXRoLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVUcyA/IGAke2l0ZW0ucGF0aH0ke3NlcH12PSR7dGhpcy5jYWNoZVRzfWAgOiBpdGVtLnBhdGg7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoZWR3aS1hcHAtbGlzdFwiICpuZ0Zvcj1cImxldCBncm91cCBvZiBhcHBHcm91cHNcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiaGVkd2ktYXBwLWl0ZW1cIlxuICAgIFtjbGFzcy5leHRyYV09XCJncm91cFswXT8uZXh0cmFcIlxuICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwXCJcbiAgPlxuICAgIDxhIFthdHRyLmhyZWZdPVwibGlua0hyZWYoaXRlbSlcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWR3aS1hcHAtbG9nb1wiPlxuICAgICAgICA8aW1nIFtzcmNdPVwiaWNvblVybChpdGVtKVwiIFthbHRdPVwiZGlzcGxheU5hbWUoaXRlbSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVkd2ktYXBwLW5hbWVcIj5cbiAgICAgICAgPHNwYW4+e3sgZGlzcGxheU5hbWUoaXRlbSkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 默认应用名称的 i18n 文案,供 extract-i18n 提取;运行时由 $localize 替换为当前语言。
3
+ */
4
+ export const HEDWI_APP_MENU_I18N_NAMES = {
5
+ 'Header|Mail': $localize `:Header|Mail:Mail`,
6
+ 'Header|Contacts': $localize `:Header|Contacts:Contacts`,
7
+ 'Header|Calendar': $localize `:Header|Calendar:Calendar`,
8
+ 'Header|AI': $localize `:Header|AI:AI`,
9
+ 'Header|Chat': $localize `:Header|Chat:Chat`,
10
+ 'Header|Meet': $localize `:Header|Meet:Meet`,
11
+ 'Header|Kanban': $localize `:Header|Kanban:Kanban`,
12
+ 'Header|Drive': $localize `:Header|Drive:Drive`,
13
+ 'Header|Docs': $localize `:Header|Docs:Docs`,
14
+ 'Header|Sheets': $localize `:Header|Sheets:Sheets`,
15
+ 'Header|Slides': $localize `:Header|Slides:Slides`,
16
+ 'Header|Note': $localize `:Header|Note:Note`,
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUuaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hlZHdpLWFwcC1tZW51L3NyYy9saWIvYXBwLW1lbnUuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUEyQjtJQUMvRCxhQUFhLEVBQUUsU0FBUyxDQUFBLG1CQUFtQjtJQUMzQyxpQkFBaUIsRUFBRSxTQUFTLENBQUEsMkJBQTJCO0lBQ3ZELGlCQUFpQixFQUFFLFNBQVMsQ0FBQSwyQkFBMkI7SUFDdkQsV0FBVyxFQUFFLFNBQVMsQ0FBQSxlQUFlO0lBQ3JDLGFBQWEsRUFBRSxTQUFTLENBQUEsbUJBQW1CO0lBQzNDLGFBQWEsRUFBRSxTQUFTLENBQUEsbUJBQW1CO0lBQzNDLGVBQWUsRUFBRSxTQUFTLENBQUEsdUJBQXVCO0lBQ2pELGNBQWMsRUFBRSxTQUFTLENBQUEscUJBQXFCO0lBQzlDLGFBQWEsRUFBRSxTQUFTLENBQUEsbUJBQW1CO0lBQzNDLGVBQWUsRUFBRSxTQUFTLENBQUEsdUJBQXVCO0lBQ2pELGVBQWUsRUFBRSxTQUFTLENBQUEsdUJBQXVCO0lBQ2pELGFBQWEsRUFBRSxTQUFTLENBQUEsbUJBQW1CO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOm7mOiupOW6lOeUqOWQjeensOeahCBpMThuIOaWh+ahiO+8jOS+myBleHRyYWN0LWkxOG4g5o+Q5Y+W77yb6L+Q6KGM5pe255SxICRsb2NhbGl6ZSDmm7/mjaLkuLrlvZPliY3or63oqIDjgIJcbiAqL1xuZXhwb3J0IGNvbnN0IEhFRFdJX0FQUF9NRU5VX0kxOE5fTkFNRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdIZWFkZXJ8TWFpbCc6ICRsb2NhbGl6ZWA6SGVhZGVyfE1haWw6TWFpbGAsXG4gICdIZWFkZXJ8Q29udGFjdHMnOiAkbG9jYWxpemVgOkhlYWRlcnxDb250YWN0czpDb250YWN0c2AsXG4gICdIZWFkZXJ8Q2FsZW5kYXInOiAkbG9jYWxpemVgOkhlYWRlcnxDYWxlbmRhcjpDYWxlbmRhcmAsXG4gICdIZWFkZXJ8QUknOiAkbG9jYWxpemVgOkhlYWRlcnxBSTpBSWAsXG4gICdIZWFkZXJ8Q2hhdCc6ICRsb2NhbGl6ZWA6SGVhZGVyfENoYXQ6Q2hhdGAsXG4gICdIZWFkZXJ8TWVldCc6ICRsb2NhbGl6ZWA6SGVhZGVyfE1lZXQ6TWVldGAsXG4gICdIZWFkZXJ8S2FuYmFuJzogJGxvY2FsaXplYDpIZWFkZXJ8S2FuYmFuOkthbmJhbmAsXG4gICdIZWFkZXJ8RHJpdmUnOiAkbG9jYWxpemVgOkhlYWRlcnxEcml2ZTpEcml2ZWAsXG4gICdIZWFkZXJ8RG9jcyc6ICRsb2NhbGl6ZWA6SGVhZGVyfERvY3M6RG9jc2AsXG4gICdIZWFkZXJ8U2hlZXRzJzogJGxvY2FsaXplYDpIZWFkZXJ8U2hlZXRzOlNoZWV0c2AsXG4gICdIZWFkZXJ8U2xpZGVzJzogJGxvY2FsaXplYDpIZWFkZXJ8U2xpZGVzOlNsaWRlc2AsXG4gICdIZWFkZXJ8Tm90ZSc6ICRsb2NhbGl6ZWA6SGVhZGVyfE5vdGU6Tm90ZWAsXG59O1xuIl19
@@ -0,0 +1,18 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { AppMenuComponent } from './app-menu.component';
4
+ import * as i0 from "@angular/core";
5
+ export class HedwiAppMenuModule {
6
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
7
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, declarations: [AppMenuComponent], imports: [CommonModule], exports: [AppMenuComponent] }); }
8
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, imports: [CommonModule] }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, decorators: [{
11
+ type: NgModule,
12
+ args: [{
13
+ imports: [CommonModule],
14
+ declarations: [AppMenuComponent],
15
+ exports: [AppMenuComponent],
16
+ }]
17
+ }] });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaGVkd2ktYXBwLW1lbnUvc3JjL2xpYi9hcHAtbWVudS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBT3hELE1BQU0sT0FBTyxrQkFBa0I7K0dBQWxCLGtCQUFrQjtnSEFBbEIsa0JBQWtCLGlCQUhkLGdCQUFnQixhQURyQixZQUFZLGFBRVosZ0JBQWdCO2dIQUVmLGtCQUFrQixZQUpuQixZQUFZOzs0RkFJWCxrQkFBa0I7a0JBTDlCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDaEMsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQzVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBcHBNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9hcHAtbWVudS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQXBwTWVudUNvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtBcHBNZW51Q29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgSGVkd2lBcHBNZW51TW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 默认应用列表,各项目可通过 apps 输入覆盖
3
+ */
4
+ 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 },
17
+ ];
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=
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Public API Surface of hedwi-app-menu
3
+ */
4
+ export { HedwiAppMenuModule } from './lib/app-menu.module';
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=
@@ -0,0 +1,116 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, Input, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+
6
+ /**
7
+ * 默认应用列表,各项目可通过 apps 输入覆盖
8
+ */
9
+ 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 },
22
+ ];
23
+
24
+ /**
25
+ * 默认应用名称的 i18n 文案,供 extract-i18n 提取;运行时由 $localize 替换为当前语言。
26
+ */
27
+ const HEDWI_APP_MENU_I18N_NAMES = {
28
+ 'Header|Mail': $localize `:Header|Mail:Mail`,
29
+ 'Header|Contacts': $localize `:Header|Contacts:Contacts`,
30
+ 'Header|Calendar': $localize `:Header|Calendar:Calendar`,
31
+ 'Header|AI': $localize `:Header|AI:AI`,
32
+ 'Header|Chat': $localize `:Header|Chat:Chat`,
33
+ 'Header|Meet': $localize `:Header|Meet:Meet`,
34
+ 'Header|Kanban': $localize `:Header|Kanban:Kanban`,
35
+ 'Header|Drive': $localize `:Header|Drive:Drive`,
36
+ 'Header|Docs': $localize `:Header|Docs:Docs`,
37
+ 'Header|Sheets': $localize `:Header|Sheets:Sheets`,
38
+ 'Header|Slides': $localize `:Header|Slides:Slides`,
39
+ 'Header|Note': $localize `:Header|Note:Note`,
40
+ };
41
+
42
+ class AppMenuComponent {
43
+ constructor() {
44
+ /** 静态资源基础 URL,如 environment.baseurl */
45
+ this.baseUrl = '';
46
+ /** 缓存时间戳,用于 URL 防缓存 */
47
+ this.cacheTs = '';
48
+ /** 应用列表,不传则使用默认列表 */
49
+ this.apps = HEDWI_APP_MENU_DEFAULT_APPS;
50
+ }
51
+ /** 返回当前语言下的应用名称(支持 i18n) */
52
+ displayName(item) {
53
+ if (item.i18nKey && HEDWI_APP_MENU_I18N_NAMES[item.i18nKey] !== undefined) {
54
+ return HEDWI_APP_MENU_I18N_NAMES[item.i18nKey];
55
+ }
56
+ return item.name;
57
+ }
58
+ /** 按 groupIndex 分组,用于按行渲染 */
59
+ get appGroups() {
60
+ const map = new Map();
61
+ for (const item of this.apps) {
62
+ const g = item.groupIndex ?? (item.extra ? 1 : 0);
63
+ if (!map.has(g))
64
+ map.set(g, []);
65
+ map.get(g).push(item);
66
+ }
67
+ const maxG = Math.max(0, ...map.keys());
68
+ return Array.from({ length: maxG + 1 }, (_, i) => map.get(i) ?? []);
69
+ }
70
+ iconUrl(item) {
71
+ const base = (this.baseUrl || '').replace(/\/$/, '');
72
+ const path = `${base}/static/mail/assets/images/${item.icon}`;
73
+ return this.cacheTs ? `${path}?v=${this.cacheTs}` : path;
74
+ }
75
+ linkHref(item) {
76
+ const sep = item.path.includes('?') ? '&' : '?';
77
+ return this.cacheTs ? `${item.path}${sep}v=${this.cacheTs}` : item.path;
78
+ }
79
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
80
+ 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: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"] }] }); }
81
+ }
82
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppMenuComponent, decorators: [{
83
+ type: Component,
84
+ 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: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"] }]
85
+ }], propDecorators: { baseUrl: [{
86
+ type: Input
87
+ }], cacheTs: [{
88
+ type: Input
89
+ }], apps: [{
90
+ type: Input
91
+ }] } });
92
+
93
+ class HedwiAppMenuModule {
94
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
95
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, declarations: [AppMenuComponent], imports: [CommonModule], exports: [AppMenuComponent] }); }
96
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, imports: [CommonModule] }); }
97
+ }
98
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HedwiAppMenuModule, decorators: [{
99
+ type: NgModule,
100
+ args: [{
101
+ imports: [CommonModule],
102
+ declarations: [AppMenuComponent],
103
+ exports: [AppMenuComponent],
104
+ }]
105
+ }] });
106
+
107
+ /*
108
+ * Public API Surface of hedwi-app-menu
109
+ */
110
+
111
+ /**
112
+ * Generated bundle index. Do not edit.
113
+ */
114
+
115
+ export { AppMenuComponent, HEDWI_APP_MENU_DEFAULT_APPS, HedwiAppMenuModule };
116
+ //# sourceMappingURL=hedwi-app-menu.mjs.map
@@ -0,0 +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.i18n.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","/**\n * 默认应用名称的 i18n 文案,供 extract-i18n 提取;运行时由 $localize 替换为当前语言。\n */\nexport const HEDWI_APP_MENU_I18N_NAMES: Record<string, string> = {\n 'Header|Mail': $localize`:Header|Mail:Mail`,\n 'Header|Contacts': $localize`:Header|Contacts:Contacts`,\n 'Header|Calendar': $localize`:Header|Calendar:Calendar`,\n 'Header|AI': $localize`:Header|AI:AI`,\n 'Header|Chat': $localize`:Header|Chat:Chat`,\n 'Header|Meet': $localize`:Header|Meet:Meet`,\n 'Header|Kanban': $localize`:Header|Kanban:Kanban`,\n 'Header|Drive': $localize`:Header|Drive:Drive`,\n 'Header|Docs': $localize`:Header|Docs:Docs`,\n 'Header|Sheets': $localize`:Header|Sheets:Sheets`,\n 'Header|Slides': $localize`:Header|Slides:Slides`,\n 'Header|Note': $localize`:Header|Note:Note`,\n};\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HedwiAppItem, HEDWI_APP_MENU_DEFAULT_APPS } from './app-menu.types';\nimport { HEDWI_APP_MENU_I18N_NAMES } from './app-menu.i18n';\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 /** 返回当前语言下的应用名称(支持 i18n) */\n displayName(item: HedwiAppItem): string {\n if (item.i18nKey && HEDWI_APP_MENU_I18N_NAMES[item.i18nKey] !== undefined) {\n return HEDWI_APP_MENU_I18N_NAMES[item.i18nKey];\n }\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}/static/mail/assets/images/${item.icon}`;\n return this.cacheTs ? `${path}?v=${this.cacheTs}` : path;\n }\n\n linkHref(item: HedwiAppItem): string {\n const sep = item.path.includes('?') ? '&' : '?';\n return this.cacheTs ? `${item.path}${sep}v=${this.cacheTs}` : item.path;\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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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="hedwi-app-menu" />
5
+ export * from './public-api';
@@ -0,0 +1,18 @@
1
+ import { HedwiAppItem } from './app-menu.types';
2
+ import * as i0 from "@angular/core";
3
+ export declare class AppMenuComponent {
4
+ /** 静态资源基础 URL,如 environment.baseurl */
5
+ baseUrl: string;
6
+ /** 缓存时间戳,用于 URL 防缓存 */
7
+ cacheTs: string;
8
+ /** 应用列表,不传则使用默认列表 */
9
+ apps: HedwiAppItem[];
10
+ /** 返回当前语言下的应用名称(支持 i18n) */
11
+ displayName(item: HedwiAppItem): string;
12
+ /** 按 groupIndex 分组,用于按行渲染 */
13
+ get appGroups(): HedwiAppItem[][];
14
+ iconUrl(item: HedwiAppItem): string;
15
+ linkHref(item: HedwiAppItem): string;
16
+ 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>;
18
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 默认应用名称的 i18n 文案,供 extract-i18n 提取;运行时由 $localize 替换为当前语言。
3
+ */
4
+ export declare const HEDWI_APP_MENU_I18N_NAMES: Record<string, string>;
@@ -0,0 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./app-menu.component";
3
+ import * as i2 from "@angular/common";
4
+ export declare class HedwiAppMenuModule {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<HedwiAppMenuModule, never>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<HedwiAppMenuModule, [typeof i1.AppMenuComponent], [typeof i2.CommonModule], [typeof i1.AppMenuComponent]>;
7
+ static ɵinj: i0.ɵɵInjectorDeclaration<HedwiAppMenuModule>;
8
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 单个应用项配置,用于应用菜单库
3
+ */
4
+ export interface HedwiAppItem {
5
+ /** 应用路径,如 /mail, /chat */
6
+ path: string;
7
+ /** 图标文件名,如 mail.svg,相对于 baseUrl/static/mail/assets/images/ */
8
+ icon: string;
9
+ /** 显示名称 */
10
+ name: string;
11
+ /** i18n 键,如 "Header|Mail" */
12
+ i18nKey?: string;
13
+ /** 是否归类为「更多」应用(样式上可区分) */
14
+ extra?: boolean;
15
+ /** 分组索引:0=主应用行,1、2=更多应用行(用于多行展示) */
16
+ groupIndex?: number;
17
+ }
18
+ /**
19
+ * 默认应用列表,各项目可通过 apps 输入覆盖
20
+ */
21
+ export declare const HEDWI_APP_MENU_DEFAULT_APPS: HedwiAppItem[];
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "hedwi-app-menu",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^16.2.0",
6
+ "@angular/core": "^16.2.0",
7
+ "@angular/localize": "^16.0.0"
8
+ },
9
+ "dependencies": {
10
+ "tslib": "^2.3.0"
11
+ },
12
+ "sideEffects": false,
13
+ "module": "fesm2022/hedwi-app-menu.mjs",
14
+ "typings": "index.d.ts",
15
+ "exports": {
16
+ "./package.json": {
17
+ "default": "./package.json"
18
+ },
19
+ ".": {
20
+ "types": "./index.d.ts",
21
+ "esm2022": "./esm2022/hedwi-app-menu.mjs",
22
+ "esm": "./esm2022/hedwi-app-menu.mjs",
23
+ "default": "./fesm2022/hedwi-app-menu.mjs"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,4 @@
1
+ export { HedwiAppMenuModule } from './lib/app-menu.module';
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';