GithubHelp home page GithubHelp logo

wangzongming / qnn-react-cron Goto Github PK

View Code? Open in Web Editor NEW
76.0 5.0 13.0 710 KB

基于react和antd开发的cron表达式生成组件 React and Antd based cron expression generation components

Batchfile 0.11% JavaScript 95.36% Less 0.69% HTML 3.17% CSS 0.67%
qnn cron antd react-cron qnn-react-cron

qnn-react-cron's Introduction

qnn-react-cron npm npm

使用中遇到问题欢迎提 issues

如果组件对你有帮助的话,请使用你那个发财的小手帮我点个星星吧!

基于React及Antd的cron时间表达式生成器

效果图 效果图

声明

该组件改编自 react-cron-antd
改编原因:作者长时间未更新组件 导致组件无法正常引用,除了修复了不能组件不能使用的问题外,
在原基础增加:getCronFns、footer、国际化等功能使组件更加灵活强大,修改 value 值传入后或者更新后自动重新渲染

特性

  • 🎉 全面支持 cron:秒、分、时、日、月、周、年
  • 🎉 日及周条件互斥,自动改变响应值
  • 🎉 支持反解析 cron 表达式到 UI
  • 🎉 可结合此组件与 Antd 的下拉及输入组件封装成下拉输入框
  • 🎉 国际化支持
  • 🎉 TypeScript 支持

交流群

QQ 交流群: 854445223

安装

// yarn 安装
yarn add qnn-react-cron 

// npm 安装
npm i qnn-react-cron

对 antd 版本的支持

请自行根据自己项目中使用的的 antd 版本安装对应的 qnn-react-cron 版本

qnn-react-cron 1.x 版本使用 antd 4.x
qnn-react-cron 2.x 版本使用 antd 5.x

预览地址

codesandbox 点击直达

使用

import React from "react";
import Cron from "qnn-react-cron";

// 可使用 Cron.Provider 配置国际化语言
// 无需配置语言时,可不使用  Cron.Provider
// Cron.Provider 应该包裹于入口组件以实现全部路由下的组件内部语言都被自定义

export default ()=>{

    const cronFnsRef = useRef();

  // language 为可选参数, 具体配置如下
  const language = {

    // 面板标题,
    // panel title,
    paneTitle: {
      second: "秒",
      minute: "分",
      hour: "时",
      day: "日",
      month: "月",
      week: "周",
      year: "年",
    },

    // assign  指定
    assign: "指定",
    // Don't assign  不指定
    donTAssign: "不指定",

    // Every minute ...   每一秒钟、每一分钟
    everyTime: {
      second: "每一秒钟",
      minute: "每一分钟",
      hour: "每一小时",
      day: "每一日",
      month: "每一月",
      week: "每一周",
      year: "每年",
    },

    // weel option  周选项
    week: {
      sun: "星期日",
      mon: "星期一",
      tue: "星期二",
      wed: "星期三",
      thu: "星期四",
      fri: "星期五",
      sat: "星期六",
    },

    // from [a] to [b] [unit], executed once [unit]    a 到 b 每一个时间单位执行一次
    aTob: {
      second: (AInput, BInput) => (
        <span>{AInput}-{BInput}秒,每秒执行一次
        </span>
      ),
      minute: (AInput, BInput) => (
        <span>{AInput}-{BInput}分,每分钟执行一次
        </span>
      ),
      hour: (AInput, BInput) => (
        <span>{AInput}-{BInput}时,每小时执行一次
        </span>
      ),
      day: (AInput, BInput) => (
        <span>{AInput}-{BInput}日,每日执行一次
        </span>
      ),
      month: (AInput, BInput) => (
        <span>{AInput}-{BInput}月,每月执行一次
        </span>
      ),
      week: (AInput, BInput) => (
        <span>{AInput}-{BInput},每星期执行一次
        </span>
      ),
      year: (AInput, BInput) => (
        <span>{AInput}-{BInput}年,每年执行一次
        </span>
      ),
    },

    // from [a] [unit] start, every [b] Execute once [unit]   从 a 开始, 每一个时间单位执行一次
    aStartTob: {
      second: (AInput, BInput) => (
        <span>{AInput}秒开始,每{BInput}秒执行一次
        </span>
      ),
      minute: (AInput, BInput) => (
        <span>{AInput}分开始,每{BInput}分执行一次
        </span>
      ),
      hour: (AInput, BInput) => (
        <span>{AInput}时开始,每{BInput}小时执行一次
        </span>
      ),
      day: (AInput, BInput) => (
        <span>{AInput}日开始,每{BInput}日执行一次
        </span>
      ),
      month: (AInput, BInput) => (
        <span>{AInput}月开始,每{BInput}月执行一次
        </span>
      ),

      // [n] in the NTH week of this month    本月第 n 周的 星期[n] 执行一次
      week: (AInput, BInput) => (
        <span>
          本月第{AInput}周的{BInput}执行一次
        </span>
      ),

      // 本月的最后一个 星期[n] 执行一次
      week2: (AInput) => <span>月的最后一个{AInput}执行一次</span>,

      year: (AInput, BInput) => (
        <span>{AInput}年开始,每{BInput}年执行一次
        </span>
      ),
    }

  };

  return <Cron.Provider value={{
    // Minimum optional year    最小可选择的年份
    minYear: new Date().getFullYear(),
    // Maximum optional year   最大可选择的年份
    maxYear: new Date().getFullYear() + 60,
    // language   国际化语言配置
    language
  }}>
    <Cron
      value="* * * * * ? *"

      // 配置面板的隐藏, false 即隐藏
      // Configuration panel hiding
      panesShow={{
        second: true,
        minute: true,
        hour: true,
        day: true,
        month: true,
        week: true,
        year: true,
      }}

      // 默认显示哪个面板, 默认为有值且未隐藏的第一个面板 或者 第一个未被隐藏的面板, 设置后将不会自动跳转到有值的面板,而是定死默认显示某个面板
      // Which panel is displayed by default. The default is the first panel that has a value and is not hidden or the first panel that is not hidden. After setting this parameter, the system does not automatically jump to the panel that has a value
      defaultTab={"second"}

      // 未自定义底部按钮时,用户点击确认按钮后的回调
      // The bottom button is not customized when the user clicks the confirm button after the callback
      onOk={(value) => {
        console.log("cron:", value);
      }}

      // 相当于 ref
      // equivalent to ref
      getCronFns={(fns) => {
        // 获取值方法
        // fns.getValue: () => string

        // 解析Cron表达式到UI 调用该方法才可以重新渲染 【一般不使用】(value值改变后组件会自动更新渲染)
        // fns.onParse: () => Promise().then(()=>void).catch(()=>()=>void),
        cronFnsRef.current = fns;
      }}

      // 自定义底部按钮后需要自行调用方法来或者值
      // After customizing the bottom button, you need to call the method or value
      footer={[
        //默认值
        <Button key="1" style={{ marginRight: 10 }} onClick={() => cronFnsRef.current.onParse("* * * * * ? *")}>
          解析到UI
        </Button>,
        <Button key="2" type="primary" onClick={() => console.log(cronFnsRef.current.getValue())}>
          生成
        </Button>
      ]}

      // onChange 事件,当值改变时触发 
      // onChange event, triggered when the value changes 
      // @param type = "second" | "minute" | "hour" | "day" | "month" | "week" | "year"
      // @param value = string
      onChange={({ type, value }) => {
        console.log(type, value)
      }}
    />
  </Cron.Provider>
}

TypeScript 描述

// CronProps 组件接受的 props
// CronFns 实际上是组件的 ref
import { CronProps, CronFns } from "qnn-react-cron"

// ts 中引用的方式
import * as QnnCron from "qnn-react-cron"

TypeScript 项目中使用

方式一

用 * as 引入,这种方式和在ts项目中使用react一样,可能还需要修改 tsconfig.json,自行百度即可。

import * as QnnCron from "qnn-react-cron"
方式二

在项目的 src 中新增一个 custom.d.ts 然后写入下面内容。

declare module "qnn-react-cron" {
    const content: any;
    export default content;
}

然后在项目中直接引用

import QnnCron from "qnn-react-cron"

...

为什么没有 antd 组件的样式?

在 0.5.3 版本后,为了避免打包后的样式影响定制的样式,样式使用按需加载。不再打包进组件代码中。
解决方式1:
在 babel 配置中加入以下代码:

plugins:[
    [
        "import",
        {
            libraryName: "antd",
            libraryDirectory: "es",
            style: "css",
        },
        "ant",
    ]
]


解决方式2:
或者直接在项目中引入 antd 样式,如下

import "antd/dist/antd.min.css"

一些参考

1、配合 antd Form 组件使用,打造一个可控的输入组件

LICENSE

MIT

qnn-react-cron's People

Contributors

kazoottt avatar wangzongming avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

qnn-react-cron's Issues

年选项的两个字段无法正确渲染

问题描述

其他时间都可以正常渲染,其中年的「从xx年开始,每x年执行一次」和「指定」两项无法正确回显;

radio 无法正确选中,inputcheckbox 不会正确清除;

最简代码

const [value, setValue] = useState<string>();

const onOk = (value: string) => {
    setValue(value);
}

<CronOrigin value={value} onOk={onOk} />;

样式丢失

以readme中codesandbox的代码为模版,升级qnn-react-cron到0.5.3之后样式丢失

月份天数问题

作者大大,非常感谢你的分享,但在使用的时候发现了一个小bug,不同的月份,应该对应不同的天数,而组件对天数的控制全部都是定死31天。

是否可以暴露change事件出来

组件内任意form.Item在change的时候可以暴露到外面,可以方便用户实时更新cron表达式,而不用通过click生成按钮去触发更新数据

你好,你的.d.ts有点问题

冒昧的问一句你的.d.ts是自己手写的吗。0.8.6版本中那个.d.ts有点问题。需要声明,导出default才可以,要不然使用的时候ts会报错
image

点击下拉框无法查看下拉信息

你好,我在使用此插件时,点击下拉框,下拉信息会快速展开并关闭,只有鼠标左键按住并移动到下拉列表才能查看内容。这种交互和antd不同,是否可以优化。

Module "./qnn-react-cron" does not exist in container.

import QnnReactCron from "qnn-react-cron";

<QnnReactCron
value={value}
onOk={(value) => {
console.log("cron:", value);
}}
getCronFns={(_cronFns) => {
cronFns = _cronFns;
}}
footer={[
<Button
key="cencel"
style={{ marginRight: 10 }}
onClick={() => {
setValue(null);
}}
>
重置
,
<Button
key="getValue"
type="primary"
onClick={() => {
setValue(cronFns.getValue());
}}
>
生成

]}
/>

[email protected] 按照demo使用,报错Module "./qnn-react-cron" does not exist in container.

周的反写有问题吗?

环境 :ts,React18,Antd5.15.4,qnn-react-cron 2.0.1
使用的是演示代码,初始值是:1,6 * * * * * ?
秒、年都反写到UI上成功,只有周一直显示不指定
onParse反写也无效?

import { useRef } from 'react'
import { Button } from 'antd'
import Cron from 'qnn-react-cron'
// language 为可选参数, 具体配置如下
const language: any = {
  // 面板标题,
  // panel title,
  paneTitle: {
    second: '秒',
    minute: '分',
    hour: '时',
    day: '日',
    month: '月',
    week: '周',
    year: '年',
  },

  // assign  指定
  assign: '指定',
  // Don't assign  不指定
  donTAssign: '不指定',

  // Every minute ...   每一秒钟、每一分钟
  everyTime: {
    second: '每一秒钟',
    minute: '每一分钟',
    hour: '每一小时',
    day: '每一日',
    month: '每一月',
    week: '每一周',
    year: '每年',
  },

  // weel option  周选项
  week: {
    sun: '星期日',
    mon: '星期一',
    tue: '星期二',
    wed: '星期三',
    thu: '星期四',
    fri: '星期五',
    sat: '星期六',
  },

  // from [a] to [b] [unit], executed once [unit]    a 到 b 每一个时间单位执行一次
  aTob: {
    second: (AInput: any, BInput: any) => (
      <span>
        从{AInput}-{BInput}秒,每秒执行一次
      </span>
    ),
    minute: (AInput: any, BInput: any) => (
      <span>
        从{AInput}-{BInput}分,每分钟执行一次
      </span>
    ),
    hour: (AInput: any, BInput: any) => (
      <span>
        从{AInput}-{BInput}时,每小时执行一次
      </span>
    ),
    day: (AInput: any, BInput: any) => (
      <span>
        从{AInput}-{BInput}日,每日执行一次
      </span>
    ),
    month: (AInput: any, BInput: any) => (
      <span>
        从{AInput}-{BInput}月,每月执行一次
      </span>
    ),
    week: (AInput: any, BInput: any) => (
      <span>
        从{AInput}-{BInput},每星期执行一次
      </span>
    ),
    year: (AInput: any, BInput: any) => (
      <span>
        从{AInput}-{BInput}年,每年执行一次
      </span>
    ),
  },

  // from [a] [unit] start, every [b] Execute once [unit]   从 a 开始, 每一个时间单位执行一次
  aStartTob: {
    second: (AInput: any, BInput: any) => (
      <span>
        从{AInput}秒开始,每{BInput}秒执行一次
      </span>
    ),
    minute: (AInput: any, BInput: any) => (
      <span>
        从{AInput}分开始,每{BInput}分执行一次
      </span>
    ),
    hour: (AInput: any, BInput: any) => (
      <span>
        从{AInput}时开始,每{BInput}小时执行一次
      </span>
    ),
    day: (AInput: any, BInput: any) => (
      <span>
        从{AInput}日开始,每{BInput}日执行一次
      </span>
    ),
    month: (AInput: any, BInput: any) => (
      <span>
        从{AInput}月开始,每{BInput}月执行一次
      </span>
    ),

    // [n] in the NTH week of this month    本月第 n 周的 星期[n] 执行一次
    week: (AInput: any, BInput: any) => (
      <span>
        本月第{AInput}周的{BInput}执行一次
      </span>
    ),

    // 本月的最后一个 星期[n] 执行一次
    week2: (AInput: any) => <span>月的最后一个{AInput}执行一次</span>,

    year: (AInput: any, BInput: any) => (
      <span>
        从{AInput}年开始,每{BInput}年执行一次
      </span>
    ),
  },
}
const Test = () => {
  const cronFnsRef = useRef<any>()
  return (
    <Cron.Provider
      value={{
        // Minimum optional year    最小可选择的年份
        minYear: new Date().getFullYear(),
        // Maximum optional year   最大可选择的年份
        maxYear: new Date().getFullYear() + 60,
        // language   国际化语言配置
        language,
      }}
    >
      <Cron
        value="1,6 * * * * * ?"
        // 配置面板的隐藏, false 即隐藏
        // Configuration panel hiding
        panesShow={{
          second: true,
          minute: true,
          hour: true,
          day: true,
          month: true,
          week: true,
          year: true,
        }}
        // 默认显示哪个面板, 默认为有值且未隐藏的第一个面板 或者 第一个未被隐藏的面板, 设置后将不会自动跳转到有值的面板,而是定死默认显示某个面板
        // Which panel is displayed by default. The default is the first panel that has a value and is not hidden or the first panel that is not hidden. After setting this parameter, the system does not automatically jump to the panel that has a value
        defaultTab={'second'}
        // 未自定义底部按钮时,用户点击确认按钮后的回调
        // The bottom button is not customized when the user clicks the confirm button after the callback
        onOk={(value: any) => {
          console.log('cron:', value)
        }}
        // 相当于 ref
        // equivalent to ref
        getCronFns={(fns: any) => {
          // 获取值方法
          // fns.getValue: () => string

          // 解析Cron表达式到UI 调用该方法才可以重新渲染 【一般不使用】(value值改变后组件会自动更新渲染)
          // fns.onParse: () => Promise().then(()=>void).catch(()=>()=>void),
          cronFnsRef.current = fns
        }}
        // 自定义底部按钮后需要自行调用方法来或者值
        // After customizing the bottom button, you need to call the method or value
        footer={[
          //默认值
          <Button
            key="1"
            style={{ marginRight: 10 }}
            onClick={() => cronFnsRef.current.onParse('1,6 ? * * * * *')}
          >
            解析到UI
          </Button>,
          <Button key="2" type="primary" onClick={() => console.log(cronFnsRef.current.getValue())}>
            生成
          </Button>,
        ]}
        // onChange 事件,当值改变时触发
        // onChange event, triggered when the value changes
        // @param type = "second" | "minute" | "hour" | "day" | "month" | "week" | "year"
        // @param value = string
        onChange={({ type, value }: any) => {
          console.log(type, value)
        }}
      />
    </Cron.Provider>
  )
}

export default Test

在默认每秒的基础上想要切换到每分的场景

Screen Shot 2022-06-15 at 10 30 54

打开readme里面的预览地址,一直出不来具体的例子。

我的问题是:
目前我在本地试的时候,给了个默认值 * * * * * ? *, 默认进去,每秒,每分,每小时,每天等单选框都是默认选中的,实际上执行就是每秒执行一次,那如果我想切换到每分,因为已经默认选中了,那怎么操作的?

1.0.3版本 类型声明文件问题

[email protected]

import QnnReactCron from 'qnn-react-cron';

<QnnReactCron // JSX element type 'QnnReactCron' does not have any construct or call signatures.
  value={value}
  onOk={(value) => {
    console.log('cron:', value);
  }}
  getCronFns={(_cronFns) => {
    cronFns = _cronFns;
  }}
  footer={[
    <Button
      key="cencel"
      style={{ marginRight: 10 }}
      onClick={() => {
        setValue(null);
      }}
    >
      重置
    </Button>,
    <Button
      key="getValue"
      type="primary"
      onClick={() => {
        setValue(cronFns.getValue());
      }}
    >
      生成
    </Button>,
  ]}
/>

报错 JSX element type 'QnnReactCron' does not have any construct or call signatures.

ts 怎么使用

import * as QnnCron from 'qnn-react-cron'

JSX 元素类型“QnnCron”不具有任何构造签名或调用签名

回显的时候Tab页显示

<Cron
      value={form.getFieldValue('cron') || '* * * * * ? *'}
      defaultTab={'day'}
      panesShow={{
        second: false,
        minute:false,
        hour: true,
        day: true,
        month:true,
        week:true,
        year:false,
      }}
      getCronFns={(fns) => {
        // console.log('fns', fns);
        setCron(fns.getValue());
      }}
      footer={null}
    />

本身默认显示的tab是[日],但是设置值之后,回显的时候,好像没有展示到其他tab页;比如我选择的是月份的,tab也还是保持在日这个tab,现在不太清楚这个是需要自己来指定的么?

可以升级到react@18吗

如题,作者可以升级一下react和react-dom的版本吗?因为项目中使用的是react18,而qnn-react-cron的peerDepenedencies是react15、16、17,使用npm/pnpm安装依赖时会报错依赖冲突

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.