@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.
@@ -1,3 +1,3 @@
1
- import React from 'react';
1
+ import React from "react";
2
2
  declare const Main: () => React.JSX.Element;
3
3
  export default Main;
@@ -1,3 +1,6 @@
1
- import React from 'react';
2
- declare const Tabs: () => React.JSX.Element;
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, useContext, useEffect, useCallback, useRef, forwardRef, useImperativeHandle, memo, useMemo } from 'react';
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
- // export const TbBase = createContext<TbBaseProviderType>({})
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
- return (React__default.createElement("div", { className: styles$6.tabFrame }, tabs?.map((m, index) => {
345
- return (React__default.createElement("div", { key: index, className: `${styles$6.tab_item} ${currentTab?.key === m.key ? styles$6.tab_select : styles$6.tab_normal}` },
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
- const { currentTab } = useTbState();
370
- return (React__default.createElement("div", { className: styles$5.mainFrame }, currentTab?.page ? currentTab.page : React__default.createElement(NullPage, null)));
419
+ return (React__default.createElement("div", { className: styles$5.mainFrame },
420
+ React__default.createElement(Outlet, null)));
371
421
  };
372
422
 
373
- var css_248z$6 = ".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 */";
374
- var styles$3 = {"loginpage":"loginpage-module_loginpage__TF9Rl"};
375
- styleInject(css_248z$6);
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$3.loginpage },
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, null),
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;