@arronqzy/abuilder-vue 0.1.7 → 0.1.9

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
@@ -27,6 +27,7 @@ createApp(App).use(Antd).mount("#app");
27
27
  :initial-zoom="1"
28
28
  default-theme="dark"
29
29
  locale="zh-CN"
30
+ name-space="my-app"
30
31
  />
31
32
  ```
32
33
 
@@ -36,13 +37,71 @@ createApp(App).use(Antd).mount("#app");
36
37
  | `initialZoom` | 画布初始缩放 | `1` |
37
38
  | `defaultTheme` | `light` / `dark` | `dark` |
38
39
  | `locale` | `zh-CN` / `en-US`;省略则按 localStorage → 浏览器 → zh-CN | `null` |
40
+ | `nameSpace` | 隔离 IndexedDB / 缓存;同一页面多个 App 传入不同值 | — |
39
41
  | `previewSearch` | 覆盖预览 URL 查询串 | 当前 `location.search` |
42
+ | `preview` | `true` 为预览页(用 `initialWorkspace`),`false` 为编辑面板 | `false` |
43
+ | `initialWorkspace` | 完整工作区;空则首次渲染空白,不会自动打开 IndexedDB 记录 | — |
40
44
 
41
45
  顶栏「语言」可运行时切换中文 / English(写入 `abuilder.locale`)。Ant Design Vue 的 `ConfigProvider.locale` 会随语言同步。
42
46
 
43
- ### 在线预览 URL
47
+ ### 编辑 / 预览模式
44
48
 
45
- 当 URL 含 `?preview=online&projectId=<id>` 时,自动渲染 `VueViewOnlinePreview`。
49
+ ```vue
50
+ <!-- 编辑:把后端工作区灌进面板 -->
51
+ <App :key="workspace.id" :initial-workspace="workspace" />
52
+
53
+ <!-- 预览:根据同一份数据直接渲染预览页 -->
54
+ <App :key="workspace.id" preview :initial-workspace="workspace" />
55
+ ```
56
+
57
+ 切换工作区时建议配合 `key`。URL 含 `?preview=online&projectId=<id>` 时也会进入预览(从 IndexedDB 加载)。传了 `nameSpace` 时预览 URL 会带 `ns=`。
58
+
59
+ ### 外部持久化
60
+
61
+ 创建 / 同步工作区时会发出事件,回调带完整 `WorkspaceData`,请写入自己的后端,不要去调编辑器内部的 IndexedDB:
62
+
63
+ ```ts
64
+ import {
65
+ addEventSubscription,
66
+ AbuilderEvents,
67
+ parseWorkspaceData,
68
+ type WorkspaceData,
69
+ } from "@arronqzy/abuilder-vue";
70
+
71
+ const addSub = addEventSubscription(AbuilderEvents.workspaceAdd, async (workspace: WorkspaceData) => {
72
+ await saveToServer(workspace);
73
+ });
74
+ const syncSub = addEventSubscription(AbuilderEvents.workspaceSync, async (workspace) => {
75
+ await saveToServer(workspace);
76
+ });
77
+ addSub.unsubscribe();
78
+ syncSub.unsubscribe();
79
+ ```
80
+
81
+ 从后端取回后用 `parseWorkspaceData` 规范化,再交给 `initialWorkspace`:
82
+
83
+ ```ts
84
+ import {
85
+ parseWorkspaceData,
86
+ createEmptyWorkspace,
87
+ createWorkspaceProjectId,
88
+ validateViewData,
89
+ validateBlueprintData,
90
+ validateWorkspaceData,
91
+ } from "@arronqzy/abuilder-vue";
92
+
93
+ const parsed = parseWorkspaceData(jsonFromBackend);
94
+ if (parsed.ok && parsed.value) {
95
+ // <App :initial-workspace="parsed.value" />
96
+ }
97
+
98
+ createEmptyWorkspace({ name: "未命名", id: createWorkspaceProjectId() });
99
+ validateWorkspaceData(workspace); // 只检查,不改数据
100
+ ```
101
+
102
+ `validate*` 只回答能不能用。`parseWorkspaceData` 会补齐 `id` / 时间戳 / 空字段。只检查视图或只检查蓝图时用 `validateViewData` / `parseViewData`、`validateBlueprintData` / `parseBlueprintData`。
103
+
104
+ 本包 **没有** `getPreviewSnapshot`(React 的 `@arronqzy/abuilder` 才有画布截图)。Vue 侧若需要缩略图,请自行对预览 DOM 截图,不要假定存在同名导出。
46
105
 
47
106
  ## 依赖包
48
107
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arronqzy/abuilder-vue",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Abuilder Vue 3 可视化编辑器入口包",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -14,8 +14,8 @@
14
14
  "dependencies": {
15
15
  "ant-design-vue": "^4.2.6",
16
16
  "vue": "^3.5.13",
17
- "@arronqzy/i18n": "0.1.7",
18
- "@arronqzy/vue-view": "0.1.9"
17
+ "@arronqzy/vue-view": "0.1.11",
18
+ "@arronqzy/i18n": "0.1.8"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "vue": "^3.4.0"
package/src/App.vue CHANGED
@@ -9,16 +9,26 @@ import {
9
9
  parseOnlinePreviewSearchParams,
10
10
  } from "@arronqzy/vue-view";
11
11
  import { provideI18n } from "@arronqzy/i18n/vue";
12
- import { isLocale } from "@arronqzy/i18n";
12
+ import { isLocale, LOCALE_STORAGE_KEY } from "@arronqzy/i18n";
13
13
  import type { AbuilderVueAppProps } from "./types";
14
14
 
15
15
  const props = withDefaults(defineProps<AbuilderVueAppProps>(), {
16
16
  initialZoom: 1,
17
17
  defaultTheme: "dark",
18
18
  locale: null,
19
+ nameSpace: null,
20
+ preview: false,
19
21
  });
20
22
 
21
- const i18n = provideI18n({ locale: props.locale });
23
+ const localeStorageKey = (() => {
24
+ const ns = (props.nameSpace ?? "").trim();
25
+ return ns ? `${LOCALE_STORAGE_KEY}__${ns.slice(0, 120)}` : LOCALE_STORAGE_KEY;
26
+ })();
27
+
28
+ const i18n = provideI18n({
29
+ locale: props.locale,
30
+ storageKey: localeStorageKey,
31
+ });
22
32
 
23
33
  watch(
24
34
  () => props.locale,
@@ -48,14 +58,23 @@ const antdLocale = computed(() =>
48
58
  }"
49
59
  >
50
60
  <VueViewOnlinePreview
51
- v-if="previewParams"
61
+ v-if="props.preview"
62
+ :workspace="props.initialWorkspace"
63
+ :project-id="props.initialWorkspace?.id"
64
+ :name-space="props.nameSpace"
65
+ />
66
+ <VueViewOnlinePreview
67
+ v-else-if="previewParams"
52
68
  :project-id="previewParams.projectId"
53
69
  :preview-instance-id="previewParams.previewInstanceId"
70
+ :name-space="previewParams.nameSpace ?? props.nameSpace"
54
71
  />
55
72
  <VueViewPanel
56
73
  v-else
57
74
  :class="props.class"
58
75
  :initial-zoom="props.initialZoom"
76
+ :name-space="props.nameSpace"
77
+ :initial-workspace="props.initialWorkspace"
59
78
  />
60
79
  </ConfigProvider>
61
80
  </template>
package/src/index.ts CHANGED
@@ -1,9 +1,28 @@
1
1
  export { default as App } from "./App.vue";
2
- export type { AbuilderVueAppProps } from "./types";
2
+ export type { AbuilderVueAppProps, WorkspaceProjectRecord } from "./types";
3
3
  export type { Locale } from "@arronqzy/i18n";
4
4
 
5
5
  export {
6
6
  VueViewPanel,
7
7
  VueViewOnlinePreview,
8
8
  parseOnlinePreviewSearchParams,
9
+ parseViewData,
10
+ validateViewData,
11
+ parseBlueprintData,
12
+ validateBlueprintData,
13
+ validateWorkspaceData,
14
+ parseWorkspaceData,
15
+ createEmptyWorkspace,
16
+ createWorkspaceProjectId,
17
+ addEventSubscription,
18
+ AbuilderEvents,
19
+ } from "@arronqzy/vue-view";
20
+ export type {
21
+ ParseCheckResult,
22
+ WorkspaceParseCheckResult,
23
+ AbuilderEventName,
24
+ AbuilderEventPayloadMap,
25
+ WorkspaceAddEventPayload,
26
+ WorkspaceSyncEventPayload,
27
+ WorkspaceData,
9
28
  } from "@arronqzy/vue-view";
package/src/types.ts CHANGED
@@ -1,9 +1,28 @@
1
+ import type { WorkspaceProjectRecord } from "@arronqzy/vue-view";
2
+
3
+ export type { WorkspaceProjectRecord };
4
+
1
5
  export type AbuilderVueAppProps = {
2
6
  class?: string;
3
7
  initialZoom?: number;
4
8
  defaultTheme?: "dark" | "light";
5
9
  previewSearch?: string;
10
+ /**
11
+ * 是否为预览模式。`true` 时根据 `initialWorkspace` 直接渲染预览页;`false` 为编辑面板。
12
+ * @default false
13
+ */
14
+ preview?: boolean;
6
15
  /** 界面语言。省略时按 localStorage → 浏览器语言 → zh-CN 解析。 */
7
16
  locale?: "zh-CN" | "en-US" | null;
17
+ /**
18
+ * 隔离 IndexedDB / localStorage / BroadcastChannel。
19
+ * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。
20
+ * 省略或空字符串保持历史全局库名。
21
+ */
22
+ nameSpace?: string | null;
23
+ /**
24
+ * 外部传入的完整工作区。省略或空则首次渲染空画布 / 空蓝图,不会自动打开 IndexedDB 中的记录。
25
+ */
26
+ initialWorkspace?: WorkspaceProjectRecord | null;
8
27
  };
9
28