为你的 Laravel Nova 新增时间范围筛选

先看看效果是啥样的哈!!!?
file

话不多说,直接撂代码!

创建你的筛选文件Your date range filter.php, 需要定义一个前端vue组件名

use Carbon\Carbon;
public function apply(Request $request, $query, $value)
{
    if (strpos($value, ' - ') === false) {
        return;
    }

    [$from, $to] = explode(' - ', $value);

    $from = Carbon::createFromFormat(config('app.date_format'), $from)
        ->setTimezone(config('app.timezone'))
        // Start at the beginning of the day.
        ->setTime(0, 0, 0)
        ->setTimezone(config('app.timezone'));

    $to = Carbon::createFromFormat(config('app.date_format'), $to)
        ->setTimezone(config('app.timezone'))
        // Include up to the end of the day.
        ->setTime(23, 59, 59)
        ->setTimezone(config('app.timezone'));

    $query->whereDate('created_at', '>=', $from->format('Y-m-d H:i:s'));
    $query->whereDate('created_at', '<=', $to->format('Y-m-d H:i:s'));
}

VUE DateRangePicker.vue

<template>
    <input
        :disabled="disabled"
        :class="{'!cursor-not-allowed': disabled}"
        :value="value"
        ref="datePicker"
        type="text"
        :placeholder="placeholder">
</template>

<script>

import flatpickr from 'flatpickr'
export default {
    props: {
        value: {
            required: false,
        },
        placeholder: {
            type: String,
            default: () => {
                return moment().format('YYYY-MM-DD') + ` ${this.default.props.seperator.default} ` + moment().format('YYYY-MM-DD')
            },
        },
        disabled: {
            type: Boolean,
            default: false,
        },
        dateFormat: {
            type: String,
            default: 'Y-m-d',
        },
        seperator: {
            type: String,
            default: '-',
        }
    },
    data: () => ({ flatpickr: null }),
    mounted() {
        this.$nextTick(() => {
            this.flatpickr = flatpickr(this.$refs.datePicker, {
                onClose: this.onChange,
                dateFormat: this.dateFormat,
                allowInput: true,
                mode: 'range',
                locale: {
                    rangeSeparator: ` ${this.seperator} `
                }
            })
        })
    },
    methods: {
        onChange(event) {
            this.$emit('change', this.$refs.datePicker.value)
        },
    },
}
</script>

<style scoped>
.\!cursor-not-allowed {
    cursor: not-allowed !important;
}
</style>

继续创建筛选vue组件。DateRangeFilter.vue 这个组件注册的名字就是在你php定义的组件名,必须要保持一致哈!


<template>
    <div>
        <h3 class="text-xs uppercase tracking-wide text-80 px-3 pt-4 pb-0">{{ filter.name }}</h3>

        <div class="p-2">
            <date-range-picker
                class="w-full form-control form-input form-input-bordered"
                dusk="date-filter"
                name="date-filter"
                :value="value"
                dateFormat="Y-m-d"
                :placeholder="placeholder"
                @input.prevent=""
                @change="handleChange"
            />
        </div>
    </div>
</template>

<script>
import DateRangePicker from '../DateRangePicker'

export default {
    components: { DateRangePicker },

    props: {
        filterKey: {
            type: String,
            required: true,
        },
        resourceName: {
            type: String,
            required: true,
        },
    },

    methods: {
        handleChange(value) {
            this.$store.commit(`${this.resourceName}/updateFilterState`, {
                filterClass: this.filterKey,
                value,
            })
            this.$emit('change')
        },
    },

    computed: {
        placeholder() {
            return this.filter.placeholder || this.__('Choose date')
        },

        value() {
            return this.filter.currentValue
        },

        filter() {
            return this.$store.getters[`${this.resourceName}/getFilter`](this.filterKey)
        },

        options() {
            return this.$store.getters[`${this.resourceName}/getOptionsForFilter`](this.filterKey)
        },
    },
}
</script>

写在后面,大家看到我发表的文章都没有文字的表达,可能大伙儿觉得我没有风趣!其实不是这样的哈。我是不善于表达。不周之处,大伙儿多多谅解!热爱生活,热爱分享。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Mujin
Mumujin
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

nova 有这类样式吗? 一直在观望中,能给几个成熟使用的nova后台功能预览吗?我想了解下到底能做到什么程度?

5年前 评论
Mumujin

@orzcc 自己开发的主题。不开源哈!

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!