jack zhang 61e9dd5cc1
feat: plugin mobile v2 (#4777)
* feat: init

* fix: mobile layout

* feat: more code

* feat: improve navigate bar

* fix: mobile title

* feat: improve code

* fix: add settings and initailzer

* fix: settings

* fix: tabbar items settings

* feat: tabbar initializer

* fix: api

* fix: styles

* feat: navbar

* feat: navigate bar tabs initializer

* feat: navigate bar tab settings

* feat: navigation bar actions

* fix: bug

* fix: bug

* fix: bug

* fix: tabbar active

* fix: bug

* fix: mobile login and layout

* fix: update version

* fix: build error

* feat: plugin settings support link

* fix: add mobile meta

* fix: desktop mode

* fix: remove old code and change collection name and mobile path

* fix: tabbar and tabs initialer layout

* fix: initializer style

* fix: adjust schema position

* fix: mobile style

* fix: delete relation resource and home page bug

* fix: support multi app

* fix: not found page

* fix: js bridge

* fix: bug

* fix: navigation bar schema flat

* fix: navigation bar action style

* fix: change version

* fix: mobile meta and real mobile test

* refactor: folder and name

* fix: navigation bar sticky and zIndex

* fix: full mobile schema

* fix: mobile readme and package.json

* fix: e2e bug

* fix: bug

* fix: tabbar style on productino

* fix: bug

* fix: rename MobileTabBar.Page

* fix: support tabbar sort

* fix: support  page tabs sort

* fix: i18n

* fix: settings utils import bug

* docs: api doc

* fix: qrcode refresh

* test: unit tests

* fix: bug

* fix: unit test

* fix: build bug

* fix: e2e test

* fix: overflow scroll

* fix: bug

* fix: scroll and overflow

* fix: bug

* fix: e2e expect await

* fix: e2e bug

* fix: bug

* fix: change name

* fix: add more e2e

* fix: page header

* fix: tab support icon

* fix: bug

* fix: bug

* fix: docs

* fix(T-4811): scroll bar too long

* fix(T-4810): desktop mode

* fix: e2e

* fix(T-4812): title empty

* fix: unit test

* feat: hide Open mode option in mobile mode

* feat: change default value of Open mode on mobile

* feat: add OpenModeProvider

* feat: support page mode

* fix: fix build

* test: update unit tests

* chore: remove pro-plugins

* fix: bug

* fix(T-4812): title is required

* fix: bug

* fix: bug

* fix: bug

* fix: bug

* refactor: remove z-index

* refactor: make better for subpages

* fix: drag bug

* fix: bug

* fix: theme bug

* fix(T-4859): create tab bar title empty

* fix(T-4857): action too long

* fix: e2e bug

* fix: remove comment

* fix: bug

* fix: theme bug

* fix: should provider modal component

* fix: bug

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: Zeke Zhang <958414905@qq.com>
2024-07-22 14:06:36 +08:00

126 lines
3.4 KiB
TypeScript

/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { useAPIClient, useCompile, useLocationSearch } from '@nocobase/client';
import { useBoolean } from 'ahooks';
import { Button, Card, Form, Input, Tabs, message } from 'antd';
import React, { useEffect, useMemo } from 'react';
import { MapTypes } from '../constants';
import { MapConfigurationResourceKey, getSSKey, useMapConfiguration } from '../hooks';
import { useMapTranslation } from '../locale';
interface BaseConfigurationProps {
type: 'amap' | 'google';
}
const BaseConfiguration: React.FC<BaseConfigurationProps> = ({ type, children }) => {
const { t } = useMapTranslation();
const [isDisabled, disableAction] = useBoolean(false);
const apiClient = useAPIClient();
const [form] = Form.useForm();
const data = useMapConfiguration(type);
useEffect(() => {
if (data) {
form.setFieldsValue(data);
disableAction.toggle();
}
}, [data]);
const resource = useMemo(() => {
return apiClient.resource(MapConfigurationResourceKey);
}, [apiClient]);
const onSubmit = (values) => {
resource
.set({
...values,
type,
})
.then((res) => {
sessionStorage.removeItem(getSSKey(type));
disableAction.toggle();
message.success(t('Saved successfully'));
})
.catch((err) => {
message.success(t('Saved failed'));
});
};
return (
<Form disabled={isDisabled} form={form} layout="vertical" onFinish={onSubmit}>
{children}
{isDisabled ? (
<Button disabled={false} onClick={disableAction.toggle}>
{t('Edit')}
</Button>
) : (
<Form.Item>
<Button disabled={false} type="primary" htmlType="submit">
{t('Save')}
</Button>
</Form.Item>
)}
</Form>
);
};
const AMapConfiguration = () => {
const { t } = useMapTranslation();
return (
<BaseConfiguration type="amap">
<Form.Item required name="accessKey" label={t('Access key')}>
<Input />
</Form.Item>
<Form.Item required name="securityJsCode" label={t('securityJsCode or serviceHost')}>
<Input />
</Form.Item>
</BaseConfiguration>
);
};
const GoogleMapConfiguration = () => {
const { t } = useMapTranslation();
return (
<BaseConfiguration type="google">
<Form.Item required name="accessKey" label={t('Api key')}>
<Input />
</Form.Item>
</BaseConfiguration>
);
};
const components = {
amap: AMapConfiguration,
google: GoogleMapConfiguration,
};
const routeList = MapTypes.map((item) => {
return {
...item,
component: components[item.value],
};
});
export const Configuration = () => {
const compile = useCompile();
const searchString = useLocationSearch();
const search = new URLSearchParams(searchString);
return (
<Card bordered>
<Tabs type="card" defaultActiveKey={search.get('tab')}>
{routeList.map((tab) => {
return (
<Tabs.TabPane key={tab.value} tab={compile(tab.label)}>
<tab.component type={tab.value} />
</Tabs.TabPane>
);
})}
</Tabs>
</Card>
);
};