SettingDrawer.tsx 16.4 KB
Newer Older
V
vben 已提交
1 2 3 4 5
import type { ProjectConfig } from '/@/types/config';

import defaultSetting from '/@/settings/projectSetting';

import { defineComponent, computed, unref, FunctionalComponent } from 'vue';
陈文彬 已提交
6 7
import { BasicDrawer } from '/@/components/Drawer/index';
import { Divider, Switch, Tooltip, InputNumber, Select } from 'ant-design-vue';
V
vben 已提交
8
import { Button } from '/@/components/Button';
陈文彬 已提交
9
import { CopyOutlined, RedoOutlined, CheckOutlined } from '@ant-design/icons-vue';
V
vben 已提交
10 11

import { MenuTypeEnum } from '/@/enums/menuEnum';
陈文彬 已提交
12 13 14 15
import { appStore } from '/@/store/modules/app';

import { useMessage } from '/@/hooks/web/useMessage';
import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
V
vben 已提交
16 17 18 19
import { useRootSetting } from '/@/hooks/setting/useRootSetting';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
V
vben 已提交
20
import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
V
vben 已提交
21
import { useI18n } from '/@/hooks/web/useI18n';
陈文彬 已提交
22 23

import { updateColorWeak, updateGrayMode } from '/@/setup/theme';
V
vben 已提交
24

V
vben 已提交
25
import { baseHandler } from './handler';
V
vben 已提交
26

V
vben 已提交
27 28 29 30 31 32
import {
  HandlerEnum,
  contentModeOptions,
  topMenuAlignOptions,
  menuTriggerOptions,
  routerTransitionOptions,
V
vben 已提交
33 34 35
  menuTypeList,
} from './enum';

36
import { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/colorSetting';
陈文彬 已提交
37 38 39 40 41 42 43 44 45

interface SwitchOptions {
  config?: DeepPartial<ProjectConfig>;
  def?: any;
  disabled?: boolean;
  handler?: Fn;
}

interface SelectConfig {
V
vben 已提交
46
  options?: LabelValueOptions;
陈文彬 已提交
47 48 49 50 51
  def?: any;
  disabled?: boolean;
  handler?: Fn;
}

V
vben 已提交
52 53 54 55
interface ThemePickerProps {
  colorList: string[];
  handler: Fn;
  def: string;
56 57
}

V
vben 已提交
58
const { createSuccessModal, createMessage } = useMessage();
V
vben 已提交
59
const { t } = useI18n();
V
vben 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

/**
 * Menu type Picker comp
 */
const MenuTypePicker: FunctionalComponent = () => {
  const { getIsHorizontal, getMenuType } = useMenuSetting();
  return (
    <div class={`setting-drawer__siderbar`}>
      {menuTypeList.map((item) => {
        const { title, type: ItemType, mode, src } = item;
        return (
          <Tooltip title={title} placement="bottom" key={title}>
            {{
              default: () => (
                <div
                  onClick={baseHandler.bind(null, HandlerEnum.CHANGE_LAYOUT, {
                    mode: mode,
                    type: ItemType,
                    split: unref(getIsHorizontal) ? false : undefined,
                  })}
                >
                  <CheckOutlined
                    class={['check-icon', unref(getMenuType) === ItemType ? 'active' : '']}
                  />
                  <img src={src} />
                </div>
              ),
            }}
          </Tooltip>
        );
      })}
    </div>
  );
};

const ThemePicker: FunctionalComponent<ThemePickerProps> = (props) => {
  return (
    <div class={`setting-drawer__theme-item`}>
      {props.colorList.map((color) => {
        return (
          <span
            onClick={() => props.handler?.(color)}
            key={color}
            class={[props.def === color ? 'active' : '']}
            style={{
              background: color,
            }}
          >
            <CheckOutlined class="icon" />
          </span>
        );
      })}
    </div>
  );
};

/**
 * FooterButton component
 */
const FooterButton: FunctionalComponent = () => {
  const { getRootSetting } = useRootSetting();
  function handleCopy() {
    const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(getRootSetting), null, 2));
    unref(isSuccessRef) &&
      createSuccessModal({
V
vben 已提交
125 126
        title: t('layout.setting.operatingTitle'),
        content: t('layout.setting.operatingContent'),
V
vben 已提交
127 128 129 130 131 132 133 134 135
      });
  }
  function handleResetSetting() {
    try {
      appStore.commitProjectConfigState(defaultSetting);
      const { colorWeak, grayMode } = defaultSetting;
      // updateTheme(themeColor);
      updateColorWeak(colorWeak);
      updateGrayMode(grayMode);
V
vben 已提交
136
      createMessage.success(t('layout.setting.resetSuccess'));
V
vben 已提交
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
    } catch (error) {
      createMessage.error(error);
    }
  }

  function handleClearAndRedo() {
    localStorage.clear();
    appStore.resumeAllState();
    location.reload();
  }

  return (
    <div class="setting-drawer__footer">
      <Button type="primary" block onClick={handleCopy}>
        {() => (
          <>
            <CopyOutlined class="mr-2" />
V
vben 已提交
154
            {t('layout.setting.copyBtn')}
V
vben 已提交
155 156 157 158 159 160 161
          </>
        )}
      </Button>
      <Button block class="mt-2" onClick={handleResetSetting} color="warning">
        {() => (
          <>
            <RedoOutlined class="mr-2" />
V
vben 已提交
162
            {t('layout.setting.resetBtn')}
V
vben 已提交
163 164 165 166 167 168 169
          </>
        )}
      </Button>
      <Button block class="mt-2" onClick={handleClearAndRedo} color="error">
        {() => (
          <>
            <RedoOutlined class="mr-2" />
V
vben 已提交
170
            {t('layout.setting.clearBtn')}
V
vben 已提交
171 172 173 174 175 176 177
          </>
        )}
      </Button>
    </div>
  );
};

陈文彬 已提交
178 179 180
export default defineComponent({
  name: 'SettingDrawer',
  setup(_, { attrs }) {
V
vben 已提交
181 182 183 184 185 186 187 188 189 190
    const {
      getContentMode,
      getShowFooter,
      getShowBreadCrumb,
      getShowBreadCrumbIcon,
      getShowLogo,
      getFullContent,
      getColorWeak,
      getGrayMode,
    } = useRootSetting();
陈文彬 已提交
191

V
vben 已提交
192 193 194 195 196 197 198
    const {
      getOpenPageLoading,
      getBasicTransition,
      getEnableTransition,
      getOpenNProgress,
    } = useTransitionSetting();

V
vben 已提交
199 200 201 202 203 204 205 206 207
    const {
      getIsHorizontal,
      getShowMenu,
      getMenuType,
      getTrigger,
      getCollapsedShowTitle,
      getMenuFixed,
      getCollapsed,
      getShowSearch,
V
vben 已提交
208
      getCanDrag,
V
vben 已提交
209 210 211 212 213 214 215
      getTopMenuAlign,
      getAccordion,
      getMenuWidth,
      getMenuBgColor,
      getIsTopMenu,
      getSplit,
    } = useMenuSetting();
陈文彬 已提交
216

V
vben 已提交
217
    const { getShowHeader, getFixed: getHeaderFixed, getHeaderBgColor } = useHeaderSetting();
陈文彬 已提交
218

V
vben 已提交
219
    const { getShowMultipleTab, getShowQuick } = useMultipleTabSetting();
陈文彬 已提交
220 221

    const getShowMenuRef = computed(() => {
V
vben 已提交
222
      return unref(getShowMenu) && !unref(getIsHorizontal);
陈文彬 已提交
223 224
    });

V
vben 已提交
225 226 227 228
    function renderSidebar() {
      return (
        <>
          <MenuTypePicker />
V
vben 已提交
229
          {renderSwitchItem(t('layout.setting.splitMenu'), {
V
vben 已提交
230 231 232 233 234 235 236
            handler: (e) => {
              baseHandler(HandlerEnum.MENU_SPLIT, e);
            },
            def: unref(getSplit),
            disabled: !unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX,
          })}
        </>
陈文彬 已提交
237 238 239
      );
    }

V
vben 已提交
240 241 242
    function renderTheme() {
      return (
        <>
V
vben 已提交
243
          <Divider>{() => t('layout.setting.headerTheme')}</Divider>
V
vben 已提交
244 245 246 247 248 249 250
          <ThemePicker
            colorList={HEADER_PRESET_BG_COLOR_LIST}
            def={unref(getHeaderBgColor)}
            handler={(e) => {
              baseHandler(HandlerEnum.HEADER_THEME, e);
            }}
          />
V
vben 已提交
251
          <Divider>{() => t('layout.setting.sidebarTheme')}</Divider>
V
vben 已提交
252 253 254 255 256 257 258 259 260
          <ThemePicker
            colorList={SIDE_BAR_BG_COLOR_LIST}
            def={unref(getMenuBgColor)}
            handler={(e) => {
              baseHandler(HandlerEnum.MENU_THEME, e);
            }}
          />
        </>
      );
V
vben 已提交
261 262
    }

陈文彬 已提交
263 264 265 266 267
    /**
     * @description:
     */
    function renderFeatures() {
      return [
V
vben 已提交
268
        renderSwitchItem(t('layout.setting.menuDrag'), {
陈文彬 已提交
269
          handler: (e) => {
V
vben 已提交
270
            baseHandler(HandlerEnum.MENU_HAS_DRAG, e);
陈文彬 已提交
271
          },
V
vben 已提交
272
          def: unref(getCanDrag),
陈文彬 已提交
273 274
          disabled: !unref(getShowMenuRef),
        }),
V
vben 已提交
275
        renderSwitchItem(t('layout.setting.menuSearch'), {
陈文彬 已提交
276
          handler: (e) => {
V
vben 已提交
277
            baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e);
陈文彬 已提交
278
          },
V
vben 已提交
279
          def: unref(getShowSearch),
陈文彬 已提交
280 281
          disabled: !unref(getShowMenuRef),
        }),
V
vben 已提交
282
        renderSwitchItem(t('layout.setting.menuAccordion'), {
V
vben 已提交
283 284 285
          handler: (e) => {
            baseHandler(HandlerEnum.MENU_ACCORDION, e);
          },
V
vben 已提交
286
          def: unref(getAccordion),
V
vben 已提交
287 288
          disabled: !unref(getShowMenuRef),
        }),
V
vben 已提交
289
        renderSwitchItem(t('layout.setting.menuCollapse'), {
陈文彬 已提交
290
          handler: (e) => {
V
vben 已提交
291
            baseHandler(HandlerEnum.MENU_COLLAPSED, e);
陈文彬 已提交
292
          },
V
vben 已提交
293
          def: unref(getCollapsed),
陈文彬 已提交
294 295
          disabled: !unref(getShowMenuRef),
        }),
V
vben 已提交
296
        renderSwitchItem(t('layout.setting.collapseMenuDisplayName'), {
V
vben 已提交
297
          handler: (e) => {
V
vben 已提交
298
            baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e);
V
vben 已提交
299
          },
V
vben 已提交
300 301
          def: unref(getCollapsedShowTitle),
          disabled: !unref(getShowMenuRef) || !unref(getCollapsed),
V
vben 已提交
302
        }),
V
vben 已提交
303
        renderSwitchItem(t('layout.setting.fixedHeader'), {
V
vben 已提交
304 305 306
          handler: (e) => {
            baseHandler(HandlerEnum.HEADER_FIXED, e);
          },
V
vben 已提交
307 308 309
          def: unref(getHeaderFixed),
          disabled: !unref(getShowHeader),
        }),
V
vben 已提交
310
        renderSwitchItem(t('layout.setting.fixedSideBar'), {
V
vben 已提交
311 312 313 314 315
          handler: (e) => {
            baseHandler(HandlerEnum.MENU_FIXED, e);
          },
          def: unref(getMenuFixed),
          disabled: !unref(getShowMenuRef),
V
vben 已提交
316
        }),
V
vben 已提交
317
        renderSelectItem(t('layout.setting.topMenuLayout'), {
陈文彬 已提交
318
          handler: (e) => {
V
vben 已提交
319
            baseHandler(HandlerEnum.MENU_TOP_ALIGN, e);
陈文彬 已提交
320
          },
V
vben 已提交
321
          def: unref(getTopMenuAlign),
陈文彬 已提交
322
          options: topMenuAlignOptions,
V
vben 已提交
323
          disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)),
陈文彬 已提交
324
        }),
V
vben 已提交
325
        renderSelectItem(t('layout.setting.menuCollapseButton'), {
V
vben 已提交
326
          handler: (e) => {
V
vben 已提交
327
            baseHandler(HandlerEnum.MENU_TRIGGER, e);
V
vben 已提交
328
          },
V
vben 已提交
329 330
          disabled: !unref(getShowMenuRef),
          def: unref(getTrigger),
V
vben 已提交
331 332
          options: menuTriggerOptions,
        }),
V
vben 已提交
333

V
vben 已提交
334
        renderSelectItem(t('layout.setting.contentMode'), {
陈文彬 已提交
335
          handler: (e) => {
V
vben 已提交
336
            baseHandler(HandlerEnum.CONTENT_MODE, e);
陈文彬 已提交
337
          },
V
vben 已提交
338
          def: unref(getContentMode),
陈文彬 已提交
339 340 341
          options: contentModeOptions,
        }),
        <div class={`setting-drawer__cell-item`}>
V
vben 已提交
342
          <span>{t('layout.setting.autoScreenLock')}</span>
陈文彬 已提交
343
          <InputNumber
V
vben 已提交
344
            style="width:126px"
陈文彬 已提交
345 346
            size="small"
            min={0}
V
vben 已提交
347 348
            onChange={(e: any) => {
              baseHandler(HandlerEnum.LOCK_TIME, e);
陈文彬 已提交
349 350 351 352
            }}
            defaultValue={appStore.getProjectConfig.lockTime}
            formatter={(value: string) => {
              if (parseInt(value) === 0) {
V
vben 已提交
353
                return `0(${t('layout.setting.notAutoScreenLock')})`;
陈文彬 已提交
354
              }
V
vben 已提交
355
              return `${value}${t('layout.setting.minute')}`;
陈文彬 已提交
356 357 358 359
            }}
          />
        </div>,
        <div class={`setting-drawer__cell-item`}>
V
vben 已提交
360
          <span>{t('layout.setting.expandedMenuWidth')}</span>
陈文彬 已提交
361
          <InputNumber
V
vben 已提交
362
            style="width:126px"
陈文彬 已提交
363 364 365 366 367
            size="small"
            max={600}
            min={100}
            step={10}
            disabled={!unref(getShowMenuRef)}
V
vben 已提交
368
            defaultValue={unref(getMenuWidth)}
陈文彬 已提交
369
            formatter={(value: string) => `${parseInt(value)}px`}
V
vben 已提交
370
            onChange={(e: any) => {
V
vben 已提交
371
              baseHandler(HandlerEnum.MENU_WIDTH, e);
陈文彬 已提交
372 373 374 375 376 377 378 379
            }}
          />
        </div>,
      ];
    }

    function renderContent() {
      return [
V
vben 已提交
380
        renderSwitchItem(t('layout.setting.breadcrumb'), {
陈文彬 已提交
381
          handler: (e) => {
V
vben 已提交
382
            baseHandler(HandlerEnum.SHOW_BREADCRUMB, e);
陈文彬 已提交
383
          },
V
vben 已提交
384 385
          def: unref(getShowBreadCrumb),
          disabled: !unref(getShowHeader),
陈文彬 已提交
386
        }),
V
vben 已提交
387
        renderSwitchItem(t('layout.setting.breadcrumbIcon'), {
Z
ZhaoBin 已提交
388
          handler: (e) => {
V
vben 已提交
389
            baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e);
Z
ZhaoBin 已提交
390
          },
V
vben 已提交
391 392
          def: unref(getShowBreadCrumbIcon),
          disabled: !unref(getShowHeader),
Z
ZhaoBin 已提交
393
        }),
V
vben 已提交
394
        renderSwitchItem(t('layout.setting.tabs'), {
陈文彬 已提交
395
          handler: (e) => {
V
vben 已提交
396
            baseHandler(HandlerEnum.TABS_SHOW, e);
陈文彬 已提交
397
          },
V
vben 已提交
398
          def: unref(getShowMultipleTab),
陈文彬 已提交
399
        }),
V
vben 已提交
400
        renderSwitchItem(t('layout.setting.tabsQuickBtn'), {
陈文彬 已提交
401
          handler: (e) => {
V
vben 已提交
402
            baseHandler(HandlerEnum.TABS_SHOW_QUICK, e);
陈文彬 已提交
403
          },
V
vben 已提交
404 405
          def: unref(getShowQuick),
          disabled: !unref(getShowMultipleTab),
陈文彬 已提交
406
        }),
V
vben 已提交
407

V
vben 已提交
408
        renderSwitchItem(t('layout.setting.sidebar'), {
陈文彬 已提交
409
          handler: (e) => {
V
vben 已提交
410
            baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e);
陈文彬 已提交
411
          },
V
vben 已提交
412 413
          def: unref(getShowMenu),
          disabled: unref(getIsHorizontal),
陈文彬 已提交
414
        }),
V
vben 已提交
415
        renderSwitchItem(t('layout.setting.header'), {
陈文彬 已提交
416
          handler: (e) => {
V
vben 已提交
417
            baseHandler(HandlerEnum.HEADER_SHOW, e);
陈文彬 已提交
418
          },
V
vben 已提交
419
          def: unref(getShowHeader),
陈文彬 已提交
420 421 422
        }),
        renderSwitchItem('Logo', {
          handler: (e) => {
V
vben 已提交
423
            baseHandler(HandlerEnum.SHOW_LOGO, e);
陈文彬 已提交
424
          },
V
vben 已提交
425 426
          def: unref(getShowLogo),
        }),
V
vben 已提交
427
        renderSwitchItem(t('layout.setting.footer'), {
V
vben 已提交
428 429 430 431
          handler: (e) => {
            baseHandler(HandlerEnum.SHOW_FOOTER, e);
          },
          def: unref(getShowFooter),
陈文彬 已提交
432
        }),
V
vben 已提交
433
        renderSwitchItem(t('layout.setting.fullContent'), {
陈文彬 已提交
434
          handler: (e) => {
V
vben 已提交
435
            baseHandler(HandlerEnum.FULL_CONTENT, e);
陈文彬 已提交
436
          },
V
vben 已提交
437
          def: unref(getFullContent),
陈文彬 已提交
438
        }),
V
vben 已提交
439
        renderSwitchItem(t('layout.setting.grayMode'), {
陈文彬 已提交
440
          handler: (e) => {
V
vben 已提交
441
            baseHandler(HandlerEnum.GRAY_MODE, e);
陈文彬 已提交
442
          },
V
vben 已提交
443
          def: unref(getGrayMode),
陈文彬 已提交
444
        }),
V
vben 已提交
445
        renderSwitchItem(t('layout.setting.colorWeak'), {
陈文彬 已提交
446
          handler: (e) => {
V
vben 已提交
447
            baseHandler(HandlerEnum.COLOR_WEAK, e);
陈文彬 已提交
448
          },
V
vben 已提交
449
          def: unref(getColorWeak),
陈文彬 已提交
450 451 452 453
        }),
      ];
    }

V
vben 已提交
454 455 456
    function renderTransition() {
      return (
        <>
V
vben 已提交
457
          {renderSwitchItem(t('layout.setting.progress'), {
V
vben 已提交
458 459 460 461 462
            handler: (e) => {
              baseHandler(HandlerEnum.OPEN_PROGRESS, e);
            },
            def: unref(getOpenNProgress),
          })}
V
vben 已提交
463
          {renderSwitchItem(t('layout.setting.switchLoading'), {
V
vben 已提交
464 465 466 467 468 469
            handler: (e) => {
              baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e);
            },
            def: unref(getOpenPageLoading),
          })}

V
vben 已提交
470
          {renderSwitchItem(t('layout.setting.switchAnimation'), {
V
vben 已提交
471 472 473
            handler: (e) => {
              baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e);
            },
V
vben 已提交
474
            def: unref(getEnableTransition),
V
vben 已提交
475 476
          })}

V
vben 已提交
477
          {renderSelectItem(t('layout.setting.animationType'), {
V
vben 已提交
478 479 480
            handler: (e) => {
              baseHandler(HandlerEnum.ROUTER_TRANSITION, e);
            },
V
vben 已提交
481
            def: unref(getBasicTransition),
V
vben 已提交
482
            options: routerTransitionOptions,
V
vben 已提交
483
            disabled: !unref(getEnableTransition),
V
vben 已提交
484 485 486 487 488
          })}
        </>
      );
    }

陈文彬 已提交
489 490 491 492 493 494 495 496 497 498
    function renderSelectItem(text: string, config?: SelectConfig) {
      const { handler, def, disabled = false, options } = config || {};
      const opt = def ? { value: def, defaultValue: def } : {};
      return (
        <div class={`setting-drawer__cell-item`}>
          <span>{text}</span>
          <Select
            {...opt}
            disabled={disabled}
            size="small"
V
vben 已提交
499
            style={{ width: '126px' }}
陈文彬 已提交
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
            onChange={(e) => {
              handler && handler(e);
            }}
            options={options}
          />
        </div>
      );
    }

    function renderSwitchItem(text: string, options?: SwitchOptions) {
      const { handler, def, disabled = false } = options || {};
      const opt = def ? { checked: def } : {};
      return (
        <div class={`setting-drawer__cell-item`}>
          <span>{text}</span>
          <Switch
            {...opt}
            disabled={disabled}
V
vben 已提交
518
            onChange={(e: any) => {
陈文彬 已提交
519 520
              handler && handler(e);
            }}
V
vben 已提交
521 522
            checkedChildren={t('layout.setting.on')}
            unCheckedChildren={t('layout.setting.off')}
陈文彬 已提交
523 524 525 526
          />
        </div>
      );
    }
V
vben 已提交
527

陈文彬 已提交
528
    return () => (
V
vben 已提交
529 530 531 532 533 534
      <BasicDrawer
        {...attrs}
        title={t('layout.setting.drawerTitle')}
        width={330}
        wrapClassName="setting-drawer"
      >
陈文彬 已提交
535 536 537
        {{
          default: () => (
            <>
V
vben 已提交
538
              <Divider>{() => t('layout.setting.navMode')}</Divider>
陈文彬 已提交
539
              {renderSidebar()}
540
              {renderTheme()}
V
vben 已提交
541
              <Divider>{() => t('layout.setting.interfaceFunction')}</Divider>
陈文彬 已提交
542
              {renderFeatures()}
V
vben 已提交
543
              <Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>
陈文彬 已提交
544
              {renderContent()}
V
vben 已提交
545
              <Divider>{() => t('layout.setting.animation')}</Divider>
陈文彬 已提交
546 547
              {renderTransition()}
              <Divider />
V
vben 已提交
548
              <FooterButton />
陈文彬 已提交
549 550 551 552 553 554 555
            </>
          ),
        }}
      </BasicDrawer>
    );
  },
});