UNPKG

mt-flowbite-react

Version:

Official React components built for Flowbite and Tailwind CSS

283 lines (282 loc) 10.8 kB
"use strict"; 'use client'; Object.defineProperty(exports, "__esModule", { value: true }); exports.useResV2Store = exports.ResApp2Provider = exports.createResAppStore = exports.createResViewSlice = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const zustand_1 = require("zustand"); const middleware_1 = require("zustand/middleware"); const mtm_client_1 = require("../mtmapi/mtm.client"); const mtmapi_1 = require("../mtmapi/mtmapi"); const consts_1 = require("./consts"); const react_1 = require("react"); const middleware_2 = require("zustand/middleware"); const createResViewSlice = (set, get, initState) => { return { depth: 0, isLoadingDetail: false, isLoadingList: false, isOpenNewForm: false, debug: false, openQuery: false, items: [], // isOpenDebug: false, // setDebug(debug) { // set({ ...get(), debug }) // }, async addItem(item) { const pre = get(); const res = get().resView?.res; if (res) { return; } console.log('add item: ', item); set({ ...pre, items: [...pre.items, item] }); //同步到后端 const addItemResult = await (0, mtmapi_1.mtmApiAddItem)(res, item); console.log('add item result:', addItemResult); }, setDepth(depth) { if (depth > 0) { console.log('setDepth call', depth); set({ ...get(), depth }); } }, cleanItems() { set({ ...get(), items: [] }); }, setActivateId(activateId) { set({ ...get(), activateId }); get().loadDetailData(); }, handleBacktoList() { history.pushState({}, '', `${consts_1.RES_URL_ROOT} / ${get().resView?.res}`); set({ ...get(), activateId: undefined, activateItem: undefined }); }, async listQuery(newValues) { console.log('listQuery, state:', get()); const pre = get(); if (!pre.resView) { console.log('resView 对象为空,跳过数据加载'); return; } const viewType = pre.resView.viewType; const res = pre.resView.res; // if (viewType == "list") { set({ ...pre, isLoadingList: true, queryParams: { ...pre.queryParams, ...newValues, }, }); // let parentIdField = pre.resView?.parentIdField // if (!parentIdField) { // //如果没有具体指定上级过滤字段,则根据res 名称 生成。 // parentIdField = pre.parentResView?.res // } const finnalParams = { ...pre.queryParams, }; // finnalParams[parentIdField!] = pre.parentItemId const result = await (0, mtmapi_1.mtmApiCall)(res, '', finnalParams); const responseItems = result.items; set({ ...get(), isLoadingList: false, items: [ ...responseItems.map((ritem) => { return { ...ritem, }; }), ], }); // } else if (pre.resView.viewType == "edit") { // console.log("TODO: 加载 edit 数据") // } }, async loadDetailData() { const pre = get(); set({ ...pre, isLoadingDetail: true }); const res = pre.resView.res; if (pre.activateId) { //TODO: 添加前端缓存 const activateItem = await (0, mtmapi_1.GetById)(res, pre.activateId); set({ ...pre, isLoadingDetail: false, activateItem }); } }, async updateItem(item) { const pre = get(); console.log('TODO:更新item', item); // ResStoreService.syncUpdate(pre.resName, item) }, setOpenDebug: (isOpenDebug) => set((state) => { return { isOpenDebug }; }), setIsLoadingList: (isLoadingList) => set((state) => { return { isLoadingList }; }), setOpenNewForm: (isOpenNewForm) => set((state) => { return { isOpenNewForm }; }), setQueryParams: (queryParams) => set((state) => { return { queryParams }; }), setOpenQuery: (openQuery) => set((state) => { return { openQuery }; }), setOpenDeleteConfrom(isOpenDeleteConfrom) { set({ ...get(), isOpenDeleteConfrom }); }, async deleteItem(id) { const res = get().resView.res; await (0, mtmapi_1.DeleteById)(res, id); }, setDeleteItemId(deleteItemId) { set({ ...get(), deleteItemId }); }, async LoadViewConfig() { set({ ...get(), isLoadingResView: true }); const viewData = get().resView; if (!viewData) { //假如没有传入resView 的完整数据,则根据 resViewId 从后端加载。 console.log('TODO: 需要从后端根据 resViewId 加载 resView 数据'); } const pre = get(); //从视图配置中,搜索相关的表单。 //补充: 这个方式过时。新的方式是,直接使用api加载。 const createItemForm = viewData.forms?.find((form) => { return form.res == pre.resView?.res && form.action == 'create'; }); const queryForm = viewData?.forms?.find((form) => { return form.res == pre.resView?.res && form.action == 'listquery'; }); const editForm = viewData?.forms?.find((form) => { return form.res == pre.resView?.res && form.action == 'edit'; }); set({ ...get(), isLoadingResView: false, resView: viewData, newItemForm: createItemForm, queryForm, editForm, }); }, isLoadingResView: false, setLoadingResView(isLoadingResView) { set({ ...get(), isLoadingResView }); }, activatedSubView: undefined, setActivatedSubView(activatedSubView) { set({ ...get(), activatedSubView }); }, parentItemId: undefined, setParentItemId(parentItemId) { if (parentItemId) { set({ ...get(), parentItemId }); get().listQuery(); } }, activatedTagId: undefined, setActivatedTagId(activatedTagId) { set({ ...get(), activatedTagId }); }, activateSubViewId: undefined, setActivateSubViewId(activateSubViewId) { const finedResView = get().resView.subViews.find((x) => x.id.toString() == activateSubViewId); set({ ...get(), activateSubViewId, activateSubView: finedResView }); }, async setResView(resView) { const pre = get(); // let depth = 0 //当前视图的深度为上级视图的深度+1 // if (pre.parentState) { // const parentDepth = pre.parentState?.depth || 0 // depth = parentDepth + 1 // } // const resView = pre.resView if (!pre.resView.subViews) { //嵌套视图中,还需要继续加载子视图配置,因为上级视图仅加载了他自己子视图。第三级的还没加载。 resView = await mtm_client_1.mtmClient.resView.getResViewById(pre.resView.id.toString()); // console.log("newResView:", newResView) // set({ ...get(), resView: newResView }) } set({ ...get(), resView }); }, ...initState, }; }; exports.createResViewSlice = createResViewSlice; const createResAppStore = (initProps) => { return (0, zustand_1.create)()((0, middleware_1.devtools)((0, middleware_1.persist)((0, middleware_2.subscribeWithSelector)((...a) => { return { ...(0, exports.createResViewSlice)(...a), // ...createDashSlice(...a), //初始值, //提示:可以用SSR的方式设置初始值,能覆盖各个Slice中内部的初始值,这样,Slice内部可以不用管初始值的相关部分。 ...initProps, }; }), { name: `resAppStore-${initProps?.resView?.id}`, version: 1, // skipHydration: true, onRehydrateStorage(state) { // console.log("onRehydrateStorage[resView]", state) }, }))); }; exports.createResAppStore = createResAppStore; //-----------context const Context = (0, react_1.createContext)(null); function ResApp2Provider({ children, ...props }) { const storeRef = (0, react_1.useRef)(); if (!storeRef.current) { storeRef.current = (0, exports.createResAppStore)(props); } (0, react_1.useEffect)(() => { storeRef.current?.getState().setParentItemId(props?.parentItemId); }, [props?.parentItemId]); (0, react_1.useEffect)(() => { // console.log('props?.depth', props?.depth); if (props.depth) { storeRef.current?.getState().setDepth(props?.depth); } }, [props?.depth]); (0, react_1.useEffect)(() => { console.log('props?.resView', props?.resView); if (props?.resView) { storeRef.current?.getState().setResView(props.resView); } }, [props?.resView]); return ((0, jsx_runtime_1.jsxs)(Context.Provider, { value: storeRef.current, children: [children, (0, jsx_runtime_1.jsx)(SubscriptionSetup, {})] })); } exports.ResApp2Provider = ResApp2Provider; //------------事件订阅 function SubscriptionSetup() { const store = useResV2Store(); (0, react_1.useEffect)(() => { // const unsub2 = store.subscribe((state) => state.items, (a) => { // }) return () => { // unsub2() }; }, []); (0, react_1.useEffect)(() => { store.getState().LoadViewConfig(); }, []); return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {}); } function useResV2Store(selector, equals) { const store = (0, react_1.useContext)(Context); if (!store) throw new Error('Missing ResAppProvider'); if (selector) { return (0, zustand_1.useStore)(store, selector, equals); } else { return store; } } exports.useResV2Store = useResV2Store;