@thefreshop/tb 1.0.8 → 1.0.10
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/dist/cjs/index.js +107 -24
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/tbframe/layout/main.d.ts +1 -1
- package/dist/cjs/tbframe/layout/tabs.d.ts +5 -2
- package/dist/cjs/types/provider.types.d.ts +1 -0
- package/dist/esm/index.js +108 -25
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tbframe/layout/main.d.ts +1 -1
- package/dist/esm/tbframe/layout/tabs.d.ts +5 -2
- package/dist/esm/types/provider.types.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/package.json +9 -6
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { navType } from "../../types";
|
|
3
|
+
declare const Tabs: ({ nav: { menuSet, openIcon, closeIcon } }: {
|
|
4
|
+
nav: navType;
|
|
5
|
+
}) => React.JSX.Element;
|
|
3
6
|
export default Tabs;
|
|
@@ -16,6 +16,7 @@ export type ProviderType = {
|
|
|
16
16
|
SetWarning: (value: ErrMsgType) => void;
|
|
17
17
|
errMsg?: ErrMsgType;
|
|
18
18
|
setGlobalpages: (value: tabType[]) => void;
|
|
19
|
+
globalpages?: tabType[];
|
|
19
20
|
addGlobalTabs: (key: string) => void;
|
|
20
21
|
setMenupages: (value: navType) => void;
|
|
21
22
|
goTabs: (key: string) => void;
|
package/dist/esm/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import React__default, { createContext, useState,
|
|
2
|
+
import React__default, { createContext, useState, useEffect, useContext, useCallback, useMemo, useRef, forwardRef, useImperativeHandle, memo } from 'react';
|
|
3
|
+
import { useNavigate, useLocation, Outlet, createBrowserRouter, RouterProvider } from 'react-router';
|
|
3
4
|
import Editor from '@monaco-editor/react';
|
|
4
5
|
import { DownOutlined, UpOutlined, DoubleRightOutlined, DoubleLeftOutlined, LoadingOutlined, ReloadOutlined, SearchOutlined, UploadOutlined, ExclamationCircleOutlined, RedoOutlined, TagOutlined } from '@ant-design/icons';
|
|
5
6
|
import { Typography, Row, Col, Space, Button, Input, Tag, Image as Image$1, Tooltip, Upload, Form, Select, DatePicker, Switch, InputNumber, Flex, Modal, Table, List, Card, Checkbox, Tree, ConfigProvider, Result, Spin } from 'antd';
|
|
@@ -18,16 +19,35 @@ import 'dayjs/locale/ko';
|
|
|
18
19
|
|
|
19
20
|
const tbContext = createContext(undefined);
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
const SESSION_STORAGE_KEY = "tbFrameState";
|
|
22
23
|
const TbProvider = ({ children }) => {
|
|
23
24
|
const [topkey, setTopkey] = useState("");
|
|
24
25
|
const [currentTab, setCurrentTab] = useState();
|
|
25
26
|
const [user, setloginUser] = useState();
|
|
26
|
-
const [tabs, setTabs] = useState([]);
|
|
27
|
+
// const [tabs, setTabs] = useState<tabType[]>([]);
|
|
27
28
|
const [startpage, setStartpage] = useState();
|
|
28
29
|
const [errMsg, setErrMsg] = useState();
|
|
29
30
|
const [globalpages, setGlobalpages] = useState();
|
|
30
31
|
const [menupages, setMenupages] = useState();
|
|
32
|
+
// 1. 초기 상태를 sessionStorage 불러오도록 수정
|
|
33
|
+
const [tabs, setTabs] = useState(() => {
|
|
34
|
+
try {
|
|
35
|
+
const savedState = sessionStorage.getItem(SESSION_STORAGE_KEY);
|
|
36
|
+
return savedState ? JSON.parse(savedState).tabs : [];
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error("Failed to parse state from sessionStorage", error);
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// 2. 상태가 변경될 때마다 sessionStorage 저장하는 useEffect 추가
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
const stateToSave = {
|
|
46
|
+
tabs,
|
|
47
|
+
// ... 저장할 다른 상태들 ...
|
|
48
|
+
};
|
|
49
|
+
sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(stateToSave));
|
|
50
|
+
}, [tabs, currentTab /* ... 다른 상태 의존성 ... */]);
|
|
31
51
|
const addTabs = (tab) => {
|
|
32
52
|
setCurrentTab(tab);
|
|
33
53
|
if (tabs.find((m) => m.key === tab.key) === undefined) {
|
|
@@ -128,6 +148,7 @@ const TbProvider = ({ children }) => {
|
|
|
128
148
|
SetWarning,
|
|
129
149
|
errMsg,
|
|
130
150
|
setGlobalpages,
|
|
151
|
+
globalpages,
|
|
131
152
|
addGlobalTabs,
|
|
132
153
|
setMenupages,
|
|
133
154
|
goTabs,
|
|
@@ -253,6 +274,7 @@ const Menu = ({ menu_setting: { title, icon, key, children, hasPage, page, defal
|
|
|
253
274
|
const [hover, setHover] = useState(false);
|
|
254
275
|
const [subOpen, setSubOpen] = useState(false);
|
|
255
276
|
const { addTabs, currentTab, user } = useTbState();
|
|
277
|
+
const navigate = useNavigate();
|
|
256
278
|
useEffect(() => {
|
|
257
279
|
if (defalultOpen) {
|
|
258
280
|
setSubOpen(true);
|
|
@@ -284,12 +306,14 @@ const Menu = ({ menu_setting: { title, icon, key, children, hasPage, page, defal
|
|
|
284
306
|
setHover(false);
|
|
285
307
|
}, onClick: () => {
|
|
286
308
|
setSubOpen((prev) => !prev);
|
|
287
|
-
if (hasPage && currentTab?.key !== key)
|
|
309
|
+
if (hasPage && currentTab?.key !== key) {
|
|
288
310
|
addTabs({
|
|
289
311
|
title,
|
|
290
312
|
key,
|
|
291
313
|
page,
|
|
292
314
|
});
|
|
315
|
+
navigate("/" + key);
|
|
316
|
+
}
|
|
293
317
|
// console.log(tabs)
|
|
294
318
|
} },
|
|
295
319
|
React__default.createElement("div", { className: styles$9.nav_icon }, icon),
|
|
@@ -300,6 +324,7 @@ const Menu = ({ menu_setting: { title, icon, key, children, hasPage, page, defal
|
|
|
300
324
|
const SubMenu = ({ menu_setting: { title, icon, key, page, hasPage } }) => {
|
|
301
325
|
const [hover, setHover] = useState(false);
|
|
302
326
|
const { addTabs, currentTab } = useTbState();
|
|
327
|
+
const navigate = useNavigate();
|
|
303
328
|
return (React__default.createElement("div", { className: `${styles$9.sub_item} ${currentTab?.key === key ? styles$9.menu_select : hover ? styles$9.menu_hover : styles$9.menu_nomal}`, onMouseEnter: () => {
|
|
304
329
|
setHover(true);
|
|
305
330
|
}, onMouseLeave: () => {
|
|
@@ -311,6 +336,7 @@ const SubMenu = ({ menu_setting: { title, icon, key, page, hasPage } }) => {
|
|
|
311
336
|
key,
|
|
312
337
|
page,
|
|
313
338
|
});
|
|
339
|
+
navigate("/" + key);
|
|
314
340
|
// console.log(tabs)
|
|
315
341
|
} },
|
|
316
342
|
React__default.createElement("div", { className: styles$9.nav_icon }, icon),
|
|
@@ -339,12 +365,45 @@ var css_248z$9 = ".tabs-module_tabFrame__qyHsD{background-color:#fff;display:fle
|
|
|
339
365
|
var styles$6 = {"tabFrame":"tabs-module_tabFrame__qyHsD","tab_item":"tabs-module_tab_item__dtp6M","tab_item_text":"tabs-module_tab_item_text__w9h73","tab_item_button":"tabs-module_tab_item_button__2CdJE","tab_x_button":"tabs-module_tab_x_button__To6OB","tab_normal":"tabs-module_tab_normal__Ky5vz","tab_select":"tabs-module_tab_select__kEPQi"};
|
|
340
366
|
styleInject(css_248z$9);
|
|
341
367
|
|
|
342
|
-
const Tabs = () => {
|
|
343
|
-
const { tabs, removeTabs, setCurrentTab, currentTab } = useTbState();
|
|
344
|
-
|
|
345
|
-
|
|
368
|
+
const Tabs = ({ nav: { menuSet, openIcon, closeIcon } }) => {
|
|
369
|
+
const { tabs, removeTabs, setCurrentTab, addTabs, currentTab, globalpages } = useTbState();
|
|
370
|
+
const navigate = useNavigate();
|
|
371
|
+
const location = useLocation();
|
|
372
|
+
const findTabs = useCallback((pathKey) => {
|
|
373
|
+
// 1. 현재 열린 탭 중에 있는지 확인
|
|
374
|
+
const existingTab = tabs.find((t) => t.key === pathKey);
|
|
375
|
+
if (existingTab) {
|
|
376
|
+
setCurrentTab(existingTab);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
// 2. 없다면, 전체 페이지 목록에서 찾아서 추가
|
|
380
|
+
let tabInfo;
|
|
381
|
+
// 2-1. 메뉴 페이지에서 찾기
|
|
382
|
+
menuSet.forEach((item) => {
|
|
383
|
+
item.menuSetting.forEach((sub) => {
|
|
384
|
+
if (sub.key === pathKey)
|
|
385
|
+
tabInfo = sub;
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
// 2-2. 전역 페이지에서 찾기 (메뉴에 없으면)
|
|
389
|
+
if (!tabInfo) {
|
|
390
|
+
tabInfo = globalpages?.find((m) => m.key === pathKey);
|
|
391
|
+
}
|
|
392
|
+
if (tabInfo) {
|
|
393
|
+
addTabs(tabInfo);
|
|
394
|
+
}
|
|
395
|
+
}, [tabs, globalpages]);
|
|
396
|
+
// 3. 페이지 로드 시 URL을 기반으로 currentTab을 설정하는 useEffect 추가
|
|
397
|
+
useEffect(() => {
|
|
398
|
+
const pathKey = location.pathname.substring(1); // 맨 앞의 '/' 제거
|
|
399
|
+
findTabs(pathKey);
|
|
400
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
401
|
+
}, []); // 이 효과는 컴포넌트가 처음 마운트될 때 한 번만 실행됩니다.
|
|
402
|
+
return (React__default.createElement("div", { className: styles$6.tabFrame }, tabs?.map((m) => {
|
|
403
|
+
return (React__default.createElement("div", { key: m.key, className: `${styles$6.tab_item} ${currentTab?.key === m.key ? styles$6.tab_select : styles$6.tab_normal}` },
|
|
346
404
|
React__default.createElement("div", { className: styles$6.tab_item_text, onClick: () => {
|
|
347
405
|
setCurrentTab(m);
|
|
406
|
+
navigate("/" + m.key);
|
|
348
407
|
// console.log('setCurrentTab', m)
|
|
349
408
|
} }, m.title),
|
|
350
409
|
!m.noremove && (React__default.createElement("div", { className: styles$6.tab_item_button },
|
|
@@ -356,30 +415,21 @@ var css_248z$8 = ".main-module_mainFrame__Etjvl{height:100%;width:100%}\n/*# sou
|
|
|
356
415
|
var styles$5 = {"mainFrame":"main-module_mainFrame__Etjvl"};
|
|
357
416
|
styleInject(css_248z$8);
|
|
358
417
|
|
|
359
|
-
var css_248z$7 = ".nullpage-module_nullpage__aLHyg{align-items:center;display:flex;flex-direction:row;height:30vh;justify-content:center;width:100%}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm51bGxwYWdlLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBSUUsa0JBQW1CLENBSG5CLFlBQWEsQ0FDYixrQkFBbUIsQ0FJbkIsV0FBWSxDQUhaLHNCQUF1QixDQUV2QixVQUVGIiwiZmlsZSI6Im51bGxwYWdlLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIubnVsbHBhZ2Uge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMzB2aDtcclxufVxyXG4iXX0= */";
|
|
360
|
-
var styles$4 = {"nullpage":"nullpage-module_nullpage__aLHyg"};
|
|
361
|
-
styleInject(css_248z$7);
|
|
362
|
-
|
|
363
|
-
const NullPage = () => {
|
|
364
|
-
return (React__default.createElement("div", { className: styles$4.nullpage },
|
|
365
|
-
React__default.createElement("div", null, "\uD398\uC774\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.")));
|
|
366
|
-
};
|
|
367
|
-
|
|
368
418
|
const Main = () => {
|
|
369
|
-
|
|
370
|
-
|
|
419
|
+
return (React__default.createElement("div", { className: styles$5.mainFrame },
|
|
420
|
+
React__default.createElement(Outlet, null)));
|
|
371
421
|
};
|
|
372
422
|
|
|
373
|
-
var css_248z$
|
|
374
|
-
var styles$
|
|
375
|
-
styleInject(css_248z$
|
|
423
|
+
var css_248z$7 = ".loginpage-module_loginpage__TF9Rl{align-items:center;display:flex;flex-direction:column;height:100vh;justify-content:center;width:100%}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxvZ2lucGFnZS5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUlFLGtCQUFtQixDQUhuQixZQUFhLENBQ2IscUJBQXNCLENBSXRCLFlBQWEsQ0FIYixzQkFBdUIsQ0FFdkIsVUFFRiIsImZpbGUiOiJsb2dpbnBhZ2UubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5sb2dpbnBhZ2Uge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwdmg7XHJcbn1cclxuIl19 */";
|
|
424
|
+
var styles$4 = {"loginpage":"loginpage-module_loginpage__TF9Rl"};
|
|
425
|
+
styleInject(css_248z$7);
|
|
376
426
|
|
|
377
427
|
const LoginPage = () => {
|
|
378
428
|
const { loginUser } = useTbState();
|
|
379
429
|
const [user, setUser] = useState(defaultuser);
|
|
380
430
|
const [isTypeCheck, setTypeCheck] = useState(true);
|
|
381
431
|
const [editorValue, setEditorValue] = useState(JSON.stringify(defaultuser, null, 2));
|
|
382
|
-
return (React__default.createElement("div", { className: styles$
|
|
432
|
+
return (React__default.createElement("div", { className: styles$4.loginpage },
|
|
383
433
|
React__default.createElement("div", { style: { display: "flex" } },
|
|
384
434
|
React__default.createElement("button", { onClick: () => {
|
|
385
435
|
setEditorValue(JSON.stringify(alluser, null, 2));
|
|
@@ -451,6 +501,15 @@ const testuser = {
|
|
|
451
501
|
},
|
|
452
502
|
};
|
|
453
503
|
|
|
504
|
+
var css_248z$6 = ".nullpage-module_nullpage__aLHyg{align-items:center;display:flex;flex-direction:row;height:30vh;justify-content:center;width:100%}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm51bGxwYWdlLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBSUUsa0JBQW1CLENBSG5CLFlBQWEsQ0FDYixrQkFBbUIsQ0FJbkIsV0FBWSxDQUhaLHNCQUF1QixDQUV2QixVQUVGIiwiZmlsZSI6Im51bGxwYWdlLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIubnVsbHBhZ2Uge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMzB2aDtcclxufVxyXG4iXX0= */";
|
|
505
|
+
var styles$3 = {"nullpage":"nullpage-module_nullpage__aLHyg"};
|
|
506
|
+
styleInject(css_248z$6);
|
|
507
|
+
|
|
508
|
+
const NullPage = () => {
|
|
509
|
+
return (React__default.createElement("div", { className: styles$3.nullpage },
|
|
510
|
+
React__default.createElement("div", null, "\uD398\uC774\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.")));
|
|
511
|
+
};
|
|
512
|
+
|
|
454
513
|
const TbFrame = ({ setting, top, bottom, nav, top_banner, }) => {
|
|
455
514
|
const { user, startpage, setStartpage, errMsg, setGlobalpages, setMenupages } = useTbState();
|
|
456
515
|
useEffect(() => {
|
|
@@ -471,6 +530,29 @@ const TbFrame = ({ setting, top, bottom, nav, top_banner, }) => {
|
|
|
471
530
|
useEffect(() => {
|
|
472
531
|
if (!errMsg?.isPopup) ;
|
|
473
532
|
}, [errMsg]);
|
|
533
|
+
const route = () => {
|
|
534
|
+
let route = [];
|
|
535
|
+
nav.menuSet.forEach((m) => {
|
|
536
|
+
m.menuSetting.forEach((m) => {
|
|
537
|
+
route.push({
|
|
538
|
+
path: "/" + m.key,
|
|
539
|
+
element: m.page,
|
|
540
|
+
});
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
return route;
|
|
544
|
+
};
|
|
545
|
+
const router = useMemo(() => createBrowserRouter([
|
|
546
|
+
{
|
|
547
|
+
path: "/",
|
|
548
|
+
element: (React__default.createElement(MainLayout, { errMsg: errMsg, startpage: startpage, setting: setting, top_banner: top_banner, nav: nav, user: user, top: top, bottom: bottom })),
|
|
549
|
+
children: route(),
|
|
550
|
+
errorElement: React__default.createElement(NullPage, null),
|
|
551
|
+
},
|
|
552
|
+
]), []);
|
|
553
|
+
return React__default.createElement(RouterProvider, { router: router });
|
|
554
|
+
};
|
|
555
|
+
const MainLayout = ({ errMsg, startpage, setting, top_banner, nav, user, top, bottom, }) => {
|
|
474
556
|
const LOGIN = useCallback(() => {
|
|
475
557
|
if (startpage)
|
|
476
558
|
return setting?.loginpage ? setting.loginpage : React__default.createElement(LoginPage, null);
|
|
@@ -517,7 +599,7 @@ const TbFrame = ({ setting, top, bottom, nav, top_banner, }) => {
|
|
|
517
599
|
React__default.createElement("div", { className: styles$9.centerFrame, style: top_banner ? { height: "calc(100vh - 120px)" } : { height: "calc(100vh - 80px)" } },
|
|
518
600
|
React__default.createElement(Nav, { nav: nav, islogin: setting.islogin ?? false }),
|
|
519
601
|
React__default.createElement("div", { className: styles$9.contentsFrame },
|
|
520
|
-
React__default.createElement(Tabs,
|
|
602
|
+
React__default.createElement(Tabs, { nav: nav }),
|
|
521
603
|
React__default.createElement(Main, null))),
|
|
522
604
|
React__default.createElement("div", { className: styles$9.bottomFrame }, bottom && React__default.createElement(Bottom, { bottom: bottom }))))));
|
|
523
605
|
};
|
|
@@ -22382,10 +22464,11 @@ var Cropper = /** @class */function (_super) {
|
|
|
22382
22464
|
}
|
|
22383
22465
|
};
|
|
22384
22466
|
_this.recomputeCropPosition = function () {
|
|
22467
|
+
var _a, _b;
|
|
22385
22468
|
if (!_this.state.cropSize) return;
|
|
22386
22469
|
var adjustedCrop = _this.props.crop;
|
|
22387
22470
|
// Only scale if we're initialized and this is a legitimate resize
|
|
22388
|
-
if (_this.isInitialized && _this.previousCropSize) {
|
|
22471
|
+
if (_this.isInitialized && ((_a = _this.previousCropSize) === null || _a === void 0 ? void 0 : _a.width) && ((_b = _this.previousCropSize) === null || _b === void 0 ? void 0 : _b.height)) {
|
|
22389
22472
|
var sizeChanged = Math.abs(_this.previousCropSize.width - _this.state.cropSize.width) > 1e-6 || Math.abs(_this.previousCropSize.height - _this.state.cropSize.height) > 1e-6;
|
|
22390
22473
|
if (sizeChanged) {
|
|
22391
22474
|
var scaleX = _this.state.cropSize.width / _this.previousCropSize.width;
|